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
13fc709f90
  1. 5
      pom.xml
  2. 4
      src/main/java/com/example/demo/DemoApplication.java
  3. 7
      src/main/java/com/example/demo/Export/ExportService.java
  4. 295
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  5. 5
      src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java
  6. 2
      src/main/java/com/example/demo/config/Mysql3DataSourceConfig.java
  7. 110
      src/main/java/com/example/demo/controller/bean/BeanConsumeController.java
  8. 105
      src/main/java/com/example/demo/controller/bean/BeanRechargeController.java
  9. 41
      src/main/java/com/example/demo/controller/bean/BeanUserController.java
  10. 57
      src/main/java/com/example/demo/controller/coin/ConsumeController.java
  11. 18
      src/main/java/com/example/demo/controller/coin/ExportController.java
  12. 8
      src/main/java/com/example/demo/controller/coin/GoldDetailController.java
  13. 51
      src/main/java/com/example/demo/controller/coin/RechargeController.java
  14. 52
      src/main/java/com/example/demo/controller/coin/RefundController.java
  15. 2
      src/main/java/com/example/demo/controller/coin/WorkbenchController.java
  16. 37
      src/main/java/com/example/demo/domain/DTO/LiveDTO.java
  17. 41
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeArticle.java
  18. 38
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeFan.java
  19. 23
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java
  20. 43
      src/main/java/com/example/demo/domain/vo/bean/BeanConsumeLive.java
  21. 14
      src/main/java/com/example/demo/domain/vo/bean/BeanRecharge.java
  22. 47
      src/main/java/com/example/demo/domain/vo/bean/BeanRechargeInfo.java
  23. 28
      src/main/java/com/example/demo/domain/vo/bean/BeanUser.java
  24. 3
      src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java
  25. 24
      src/main/java/com/example/demo/domain/vo/bean/GoldBean.java
  26. 2
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  27. 2
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  28. 9
      src/main/java/com/example/demo/domain/vo/coin/Page.java
  29. 42
      src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java
  30. 2
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  31. 40
      src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java
  32. 14
      src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java
  33. 24
      src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java
  34. 8
      src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java
  35. 20
      src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java
  36. 13
      src/main/java/com/example/demo/mapper/coin/PermissionMapper.java
  37. 24
      src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java
  38. 35
      src/main/java/com/example/demo/service/bean/BeanConsumeService.java
  39. 30
      src/main/java/com/example/demo/service/bean/BeanRechargeService.java
  40. 11
      src/main/java/com/example/demo/service/bean/BeanUserService.java
  41. 9
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  42. 84
      src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java
  43. 67
      src/main/java/com/example/demo/service/listen/BaseMessageListener.java
  44. 42
      src/main/java/com/example/demo/service/listen/ConsumeListener.java
  45. 50
      src/main/java/com/example/demo/service/listen/GoldDetailListener.java
  46. 43
      src/main/java/com/example/demo/service/listen/GoldListener.java
  47. 38
      src/main/java/com/example/demo/service/listen/LiveListener.java
  48. 66
      src/main/java/com/example/demo/service/listen/RechargeListener.java
  49. 44
      src/main/java/com/example/demo/service/listen/RefundListener.java
  50. 86
      src/main/java/com/example/demo/serviceImpl/bean/BeanConsumeServiceImpl.java
  51. 199
      src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java
  52. 22
      src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java
  53. 1232
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  54. 10
      src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java
  55. 2
      src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java
  56. 4
      src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java
  57. 6
      src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java
  58. 2
      src/main/resources/application-dev.yml
  59. 8
      src/main/resources/application-test.yml
  60. 8
      src/main/resources/application.yml
  61. 336
      src/main/resources/jindouMapper/BeanConsumeMapper.xml
  62. 6
      src/main/resources/jindouMapper/BeanRechargeMapper.xml
  63. 64
      src/main/resources/jindouMapper/BeanRechargeMapper2.xml
  64. 74
      src/main/resources/jindouMapper/BeanUser.xml
  65. 4
      src/main/resources/mapper/AuditMapper.xml
  66. 28
      src/main/resources/mapper/BeanRechargeMapper1.xml
  67. 11
      src/main/resources/mapper/ConsumeMapper.xml
  68. 2
      src/main/resources/mapper/PermissionMapper.xml
  69. 20
      src/main/resources/mapper/RechargeMapper.xml
  70. 11
      src/main/resources/mapper/RefundMapper.xml
  71. 4
      src/main/resources/mapper/RoleMapper.xml
  72. 8
      src/main/resources/mapper/UrlMapper.xml
  73. 2
      src/main/resources/mapper/UserMapper.xml
  74. 70
      src/main/resources/paymapper/BeanRechargeMapper3.xml

5
pom.xml

@ -115,6 +115,11 @@
<version>3.0.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version> <!-- 版本号可根据实际情况调整 -->
</dependency>
<!-- <dependency>-->
<!-- <groupId>io.jsonwebtoken</groupId>-->
<!-- <artifactId>jjwt-api</artifactId>-->

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

@ -7,7 +7,9 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 启用调度功能
@MapperScan(basePackages = "com.example.demo.mapper", 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.pay", sqlSessionTemplateRef = "mysql3SqlSessionTemplate")
public class DemoApplication {
public static void main(String[] args) {

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

@ -1,9 +1,6 @@
package com.example.demo.Export;
import com.example.demo.domain.DTO.ConsumeDTO;
import com.example.demo.domain.DTO.GoldDetailDTO;
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.vo.coin.Result;
/**
@ -21,5 +18,7 @@ public interface ExportService {
Result addExportRefund(RefundDTO dto);
//消费导出
Result addExportConsume(ConsumeDTO dto);
//金豆直播导出
Result addExportLive(LiveDTO dto);
}

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

@ -2,6 +2,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.entity.Admin;
@ -32,7 +33,7 @@ import java.util.Map;
* @Version 1.0
**/
@Service
public class ExportServiceImpl implements ExportService{
public class ExportServiceImpl implements ExportService {
@Autowired
private GoldDetailMapper goldDetailMapper;
@Autowired
@ -40,174 +41,172 @@ public class ExportServiceImpl implements ExportService{
@Autowired
private AdminService adminService;
@Override
public Result addExportRecharge(RechargeDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
/**
* 通用导出逻辑
*
* @param dto 数据传输对象 (RechargeDTO, RefundDTO, ConsumeDTO)
* @param exportType 导出类型 ("充值明细", "退款明细", "消耗明细")
* @param queueName Redis 队列名称
* @param requestData 请求数据字段名 ("rechargeUser", "refundUser", "consumeUser","liveUser")
* @return Result
*/
private Result addExport(Object dto, String exportType, String queueName, String requestData) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
}
String admin = adminService.getName(String.valueOf(dto.getAccount()));
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"充值明细",
admin,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
// System.out.println(fileName);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
// 获取操作者信息
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
Integer account = Integer.valueOf(admin.getAccount());
String adminName = admin.getAdminName();
// 设置 DTO 的通用字段
setCommonFields(dto, account, adminName);
try{
// 调用方式
// 插入导出记录并获取主键
GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder();
goldDetailMapper.insertExportRecord(
idHolder, // 用于接收主键
dto.getAccount(),
dto.getType(),
dto.getState(),
dto.getUrl(),
dto.getFileName(),
dto.getDataNum()
);
// 获取主键
insertExportRecord(dto, idHolder, account);
Long recordId = idHolder.getId();
// 2. 构造完整的 JSON 数据包含所有请求参数
Map<String, Object> exportData = new HashMap<>();
exportData.put("recordId", recordId);
// 添加 token exportData
exportData.put("token", token);
// 手动构造请求数据避免 toString() 只返回部分字段
Map<String, Object> requestData = new HashMap<>();
requestData.put("rechargeUser", dto.getRechargeUser());
exportData.put("requestData", requestData);
// 3. 发送到 Redis 消息队列
// 构造完整的 JSON 数据
Map<String, Object> exportData = constructExportData(recordId, token, dto, requestData);
// 发送到 Redis 消息队列
String jsonData = new ObjectMapper().writeValueAsString(exportData);
redisUtil.sendMessage("recharge:queue:export_queue", jsonData);
}catch (Exception e){
redisUtil.sendMessage(queueName, jsonData);
} catch (Exception e) {
e.printStackTrace();
throw new SystemException("导出数据异常,请稍后重试", e);
}
return Result.success();
}
@Override
public Result addExportRefund(RefundDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
/**
* 设置 DTO 的通用字段
*/
private void setCommonFields(Object dto, Integer account,String adminName) throws Exception {
if (dto instanceof RechargeDTO rechargeDTO) {
rechargeDTO.setAccount(Integer.valueOf(account));
rechargeDTO.setUrl("");
rechargeDTO.setFileName(generateFileName("充值明细", adminName));
rechargeDTO.setDataNum(0);
} else if (dto instanceof RefundDTO refundDTO) {
refundDTO.setAccount(Integer.valueOf(account));
refundDTO.setUrl("");
refundDTO.setFileName(generateFileName("退款明细", adminName));
refundDTO.setDataNum(0);
} else if (dto instanceof ConsumeDTO consumeDTO) {
consumeDTO.setAccount(Integer.valueOf(account));
consumeDTO.setUrl("");
consumeDTO.setFileName(generateFileName("消耗明细", adminName));
consumeDTO.setDataNum(0);
} else if (dto instanceof LiveDTO liveDTO) {
liveDTO.setAccount(Integer.valueOf(account));
liveDTO.setUrl("");
liveDTO.setFileName(generateFileName("直播明细", adminName));
liveDTO.setDataNum(0);
}
String admin = adminService.getName(String.valueOf(dto.getAccount()));
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"退款明细",
admin,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
}
try{
// 调用方式
GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder();
/**
* 插入导出记录
*/
private void insertExportRecord(Object dto, GoldDetailMapper.ExportRecordIdHolder idHolder, Integer account) throws Exception {
if (dto instanceof RechargeDTO rechargeDTO) {
goldDetailMapper.insertExportRecord(
idHolder, // 用于接收主键
dto.getAccount(),
dto.getType(),
dto.getState(),
dto.getUrl(),
dto.getFileName(),
dto.getDataNum()
idHolder,
account,
rechargeDTO.getType(),
rechargeDTO.getState(),
rechargeDTO.getUrl(),
rechargeDTO.getFileName(),
rechargeDTO.getDataNum()
);
} else if (dto instanceof RefundDTO refundDTO) {
goldDetailMapper.insertExportRecord(
idHolder,
account,
refundDTO.getType(),
refundDTO.getState(),
refundDTO.getUrl(),
refundDTO.getFileName(),
refundDTO.getDataNum()
);
} else if (dto instanceof ConsumeDTO consumeDTO) {
goldDetailMapper.insertExportRecord(
idHolder,
account,
consumeDTO.getType(),
consumeDTO.getState(),
consumeDTO.getUrl(),
consumeDTO.getFileName(),
consumeDTO.getDataNum()
);
} else if(dto instanceof LiveDTO liveDTO){
goldDetailMapper.insertExportRecord(
idHolder,
account,
liveDTO.getType(),
liveDTO.getState(),
liveDTO.getUrl(),
liveDTO.getFileName(),
liveDTO.getDataNum()
);
// 获取主键
Long recordId = idHolder.getId();
// 2. 构造完整的 JSON 数据包含所有请求参数
Map<String, Object> exportData = new HashMap<>();
exportData.put("recordId", recordId);
// 添加 token exportData
exportData.put("token", token);
// 手动构造请求数据避免 toString() 只返回部分字段
Map<String, Object> requestData = new HashMap<>();
requestData.put("refundUser", dto.getRefundUser());
exportData.put("requestData", requestData);
// 3. 发送到 Redis 消息队列
String jsonData = new ObjectMapper().writeValueAsString(exportData);
redisUtil.sendMessage("refund:queue:export_queue", jsonData);
}catch (Exception e){
e.printStackTrace();
throw new SystemException("导出数据异常,请稍后重试", e);
}
return Result.success();
}
@Override
public Result addExportConsume(ConsumeDTO dto) {
// 获取操作者 jwcode
HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
dto.setAccount(Integer.valueOf(token1.getUsername()));
} catch (Exception e) {
throw new RuntimeException(e.getMessage());
/**
* 构造导出数据
*/
private Map<String, Object> constructExportData(Long recordId, String token, Object dto, String requestDataKey) throws Exception {
Map<String, Object> exportData = new HashMap<>();
exportData.put("recordId", recordId);
exportData.put("token", token);
Map<String, Object> requestData = new HashMap<>();
if (dto instanceof RechargeDTO rechargeDTO) {
requestData.put(requestDataKey, rechargeDTO.getRechargeUser());
} else if (dto instanceof RefundDTO refundDTO) {
requestData.put(requestDataKey, refundDTO.getRefundUser());
} else if (dto instanceof ConsumeDTO consumeDTO) {
requestData.put(requestDataKey, consumeDTO.getConsumeUser());
} else if(dto instanceof LiveDTO liveDTO){
requestData.put(requestDataKey, liveDTO.getBeanConsumeLive());
}
String admin = adminService.getName(String.valueOf(dto.getAccount()));
// 生成文件名
String fileName = String.format("%s_%s_%s.xlsx",
"消耗明细",
admin,
exportData.put("requestData", requestData);
return exportData;
}
/**
* 生成文件名
*/
private String generateFileName(String exportType, String adminName) {
return String.format("%s_%s_%s.xlsx",
exportType,
adminName,
LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
System.out.println(fileName);
dto.setUrl("");
dto.setFileName(fileName);
dto.setDataNum(0);
}
try{
// 调用方式
GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder();
goldDetailMapper.insertExportRecord(
idHolder, // 用于接收主键
dto.getAccount(),
dto.getType(),
dto.getState(),
dto.getUrl(),
dto.getFileName(),
dto.getDataNum()
);
// 获取主键
Long recordId = idHolder.getId();
// 2. 构造完整的 JSON 数据包含所有请求参数
Map<String, Object> exportData = new HashMap<>();
exportData.put("recordId", recordId);
// 添加 token exportData
exportData.put("token", token);
// 手动构造请求数据避免 toString() 只返回部分字段
Map<String, Object> requestData = new HashMap<>();
requestData.put("consumeUser", dto.getConsumeUser());
exportData.put("requestData", requestData);
// 3. 发送到 Redis 消息队列
String jsonData = new ObjectMapper().writeValueAsString(exportData);
redisUtil.sendMessage("consume:queue:export_queue", jsonData);
}catch (Exception e){
e.printStackTrace();
throw new SystemException("导出数据异常,请稍后重试", e);
}
return Result.success();
@Override
public Result addExportRecharge(RechargeDTO dto) {
return addExport(dto, "充值明细", "recharge:queue:export_queue", "rechargeUser");
}
@Override
public Result addExportRefund(RefundDTO dto) {
return addExport(dto, "退款明细", "refund:queue:export_queue", "refundUser");
}
@Override
public Result addExportConsume(ConsumeDTO dto) {
return addExport(dto, "消耗明细", "consume:queue:export_queue", "consumeUser");
}
@Override
public Result addExportLive(LiveDTO dto) {
return addExport(dto, "直播明细", "live:queue:export_queue", "beanConsumeLive");
}
}

5
src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java

@ -17,10 +17,7 @@ import javax.sql.DataSource;
@Slf4j
@Configuration
@MapperScan(
basePackages = "com.example.demo.mapper.bean", // 扫描coin包
sqlSessionTemplateRef = "mysql2SqlSessionTemplate"
)
public class Mysql2DataSourceConfig {
@Bean(name = "mysql2DataSource")

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

@ -29,7 +29,7 @@ public class Mysql3DataSourceConfig {
@Qualifier("globalConfiguration3") org.apache.ibatis.session.Configuration globalConfiguration3) throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(dataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:jindouMapper/*.xml"));
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:paymapper/*.xml"));
sessionFactory.setConfiguration(globalConfiguration3);
return sessionFactory.getObject();
}

110
src/main/java/com/example/demo/controller/bean/BeanConsumeController.java

@ -0,0 +1,110 @@
package com.example.demo.controller.bean;
import com.example.demo.domain.vo.bean.BeanConsumeGold;
import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.bean.BeanConsumeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanConsumeController
* @description:
* @author: Ethan
* @create: 202507-30 11:30
* @Version 1.0
**/
@RestController
@RequestMapping("/beanConsume")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class BeanConsumeController {
@Autowired
private BeanConsumeService beanConsumeService;
//获取消费用户分部信息
@PostMapping("/getDept")
public Result getDept(){
List<String> deptList = beanConsumeService.getDept();
return Result.success(deptList);
}
//筛选查询直播消费记录
@PostMapping("/selectLiveBy")
public Result selectLiveBy(@RequestBody Page page){
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(beanConsumeService.selectLiveBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeLive()));
}
} catch (Exception e) {
e.printStackTrace();
//返回堆栈信息
return Result.error(e.toString());
}}
//筛选查询铁粉消费记录
@PostMapping("/selectFanBy")
public Result selectFanBy(@RequestBody Page page){
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(beanConsumeService.selectFanBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeFan()));
}
} catch (Exception e) {
e.printStackTrace();
return Result.error(e.toString());
}}
//筛选查询文章消费记录
@PostMapping("/selectArticleBy")
public Result selectArticleBy(@RequestBody Page page){
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(beanConsumeService.selectArticleBy(page.getPageNum(), page.getPageSize(), page.getBeanConsumeArticle()));
}
} catch (Exception e) {
e.printStackTrace();
return Result.error(e.toString());
}}
//消费合计数
@PostMapping("sumConsumeGold")
public BeanConsumeGold sumConsumeGold(@RequestBody Page page) {
return beanConsumeService.sumConsumeGold( page);
}
//查询所有直播礼物
@PostMapping("/getLiveGift")
public Result getLiveGift(){
return Result.success(beanConsumeService.getLiveGift());
}
//查询所有直播频道
@PostMapping("/getLiveChannel")
public Result getLiveChannel(){
return Result.success(beanConsumeService.getLiveChannel());
}
}

105
src/main/java/com/example/demo/controller/bean/BeanRechargeController.java

@ -1,5 +1,17 @@
package com.example.demo.controller.bean;
import com.example.demo.domain.vo.bean.BeanRecharge;
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.BeanRechargeService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
/**
* @program: gold-java
* @ClassName BeanRechrageController
@ -9,5 +21,98 @@ package com.example.demo.controller.bean;
* @Version 1.0
**/
@RestController
@RequestMapping("/beanRecharge")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class BeanRechargeController {
@Autowired
private BeanRechargeService beanRechargeService;
//添加金豆
@PostMapping("/add")
public Result add(@RequestBody BeanRecharge recharge) {
try {
return beanRechargeService.add(recharge);
} catch (Exception e) {
return Result.error("添加失败");
}
}
//系统充值
@PostMapping("/selectBySystem")
public Result selectBySystem(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(beanRechargeService.selectBySystem(page.getPageNum(), page.getPageSize(), page.getBeanRechargeInfo()));
}
} catch (Exception e) {
e.printStackTrace();
return Result.error("请检查筛选数据的格式");
}
}
//系统金豆统计
@PostMapping("/statsSystemBean")
public Result statsSystemBean(@RequestBody BeanRechargeInfo beanRechargeInfo) {
try {
GoldBean goldBean = beanRechargeService.statsSystemBean(beanRechargeInfo);
return Result.success(goldBean);
} catch (Exception e) {
return Result.error("请检查数据的格式");
}
}
//获取系统充值地区
@PostMapping("/systemMarket")
public Result systemMarket()
{
List<String> list = beanRechargeService.systemMarket();
return Result.success(list);
}
//线上充值
@PostMapping("/selectByOnline")
public Result selectByOnline(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(beanRechargeService.selectByOnline(page.getPageNum(), page.getPageSize(), page.getBeanRechargeInfo()));
}
} catch (Exception e) {
e.printStackTrace();
return Result.error("请检查筛选数据的格式");
}
}
//线上金豆统计
@PostMapping("/statsOnlineBean")
public Result statsOnlineBean(@RequestBody BeanRechargeInfo beanRechargeInfo) {
try {
GoldBean goldBean = beanRechargeService.statsOnlineBean(beanRechargeInfo);
return Result.success(goldBean);
} catch (Exception e) {
return Result.error("请检查数据的格式");
}
}
//获取线上充值地区
@PostMapping("/onlineMarket")
public Result onlineMarket()
{
List<String> list = beanRechargeService.onlineMarket();
return Result.success(list);
}
}

41
src/main/java/com/example/demo/controller/bean/BeanUserController.java

@ -1,14 +1,19 @@
package com.example.demo.controller.bean;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.bean.BeanUser;
import com.example.demo.domain.vo.bean.BeanUserCard;
import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.service.bean.BeanUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanUserController
@ -34,7 +39,41 @@ public class BeanUserController {
try {
return beanUserService.userCard(user.getJwcode().toString());
} catch (Exception e) {
return Result.error("请检查输入精网号");
return Result.error("请检查输入精网号格式");
}
}
//客户金豆余额
@PostMapping("/userBean")
public Result userBean(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(beanUserService.selectUserBy(page.getPageNum(), page.getPageSize(), page.getBeanUser()));
}
} catch (Exception e) {
e.printStackTrace();
return Result.error(e.toString());
}}
//客户金币余额合计数
@PostMapping("/userBeanSum")
public Result userBeanSum(@RequestBody Page page) {
return Result.success(beanUserService.sumUserGold(page));
}
//查询客户分部
@PostMapping("/getDept")
public Result getDept() {
List<String> deptList = beanUserService.getDept();
return Result.success(deptList);
}
}

57
src/main/java/com/example/demo/controller/coin/ConsumeController.java

@ -10,6 +10,7 @@ import com.example.demo.service.coin.ConsumeService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
@ -85,15 +86,15 @@ public class ConsumeController {
return Result.error("页大小为空!");
} else {
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
page.getConsumeUser().setMarkets(list);
}
else{
return Result.error("角色为空");
if(page.getConsumeUser().getMarkets()==null||page.getConsumeUser().getMarkets().isEmpty()) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("1")) {
page.getConsumeUser().setMarkets(markets);
}
}
return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser()));
}
@ -108,16 +109,15 @@ public class ConsumeController {
@PostMapping("/statsGold")
public Result statsGold(@RequestBody ConsumeUser consumeUser) {
try {
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
consumeUser.setMarkets(list);
}
else{
return Result.error("角色为空");
if(consumeUser.getMarkets()==null||consumeUser.getMarkets().isEmpty()) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("1")) {
consumeUser.setMarkets(markets);
}
}
Gold gold = consumeService.statsGold(consumeUser);
return Result.success(gold);
@ -144,6 +144,25 @@ public class ConsumeController {
}
}
public Result select(@RequestBody Page page) {
try {
//页码校验
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
//页面大小校验
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(consumeService.selectBy(page.getPageNum(), page.getPageSize(), page.getConsumeUser()));
}
} catch (Exception e) {
e.printStackTrace();
return Result.error("请检查筛选数据的格式");
}
}
}

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

@ -4,6 +4,7 @@ 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.entity.Admin;
@ -100,4 +101,21 @@ public class ExportController {
redisLockUtil.unlock(lockKey, requestId);
}
}
@PostMapping("/exportLive")
public Result export(@Valid @RequestBody LiveDTO 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.addExportLive(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
}

8
src/main/java/com/example/demo/controller/coin/GoldDetailController.java

@ -65,7 +65,7 @@ public class GoldDetailController {
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));;
if(!markets.contains("总部")) {
if(!markets.contains("1")) {
page.getGoldDetail().setMarkets(markets);
}
}
@ -82,7 +82,7 @@ public class GoldDetailController {
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("总部")) {
if(!markets.contains("1")) {
page.getGoldDetail().setMarkets(markets);
}
}
@ -96,7 +96,7 @@ public class GoldDetailController {
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("总部")) {
if(!markets.contains("1")) {
user.setMarkets(markets);
}
}
@ -117,7 +117,7 @@ public class GoldDetailController {
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("总部")) {
if(!markets.contains("1")) {
page.getUser().setMarkets(markets);
}
}

51
src/main/java/com/example/demo/controller/coin/RechargeController.java

@ -7,6 +7,7 @@ import com.example.demo.service.coin.RechargeService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
@ -78,15 +79,14 @@ public class RechargeController {
return Result.error("页大小为空!");
} else {
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
page.getRechargeUser().setMarkets(list);
}
else{
return Result.error("角色为空");
if(page.getRechargeUser().getMarkets()==null||page.getRechargeUser().getMarkets().isEmpty()){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));;
if(!markets.contains("1")) {
page.getRechargeUser().setMarkets(markets);
}
}
return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser()));
}
@ -101,15 +101,14 @@ public class RechargeController {
public Result statsGold(@RequestBody RechargeUser rechargeUser) {
try {
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
rechargeUser.setMarkets(list);
}
else{
return Result.error("角色为空");
if(rechargeUser.getMarkets()==null||rechargeUser.getMarkets().isEmpty()){
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));;
if(!markets.contains("1")) {
rechargeUser.setMarkets(markets);
}
}
Gold gold = rechargeService.statsGold(rechargeUser);
return Result.success(gold);
@ -129,5 +128,21 @@ public class RechargeController {
}
public Result selcet(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
//解token权限
return Result.success(rechargeService.selectBy(page.getPageNum(), page.getPageSize(), page.getRechargeUser()));
}
} catch (Exception e) {
return Result.error("请检查筛选数据的格式");
}
}
}

52
src/main/java/com/example/demo/controller/coin/RefundController.java

@ -6,6 +6,7 @@ import com.example.demo.service.coin.RefundService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ObjectUtils;
import org.springframework.web.bind.annotation.*;
@ -73,14 +74,15 @@ public class RefundController {
return Result.error("页大小为空!");
} else {
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
page.getRefundUser().setMarkets(list);
} else {
return Result.error("角色为空");
if(page.getRefundUser().getMarkets()==null||page.getRefundUser().getMarkets().isEmpty()) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("1")) {
page.getRefundUser().setMarkets(markets);
}
}
return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
}
@ -95,15 +97,15 @@ public class RefundController {
public Result statsGold(@RequestBody RefundUser refundUser) {
try {
//解token权限
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
if (admin != null) {
List<String> list = Arrays.asList(admin.getMarkets().split(","));
refundUser.setMarkets(list);
}
else{
return Result.error("角色为空");
if(refundUser.getMarkets()==null||refundUser.getMarkets().isEmpty()) {
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String token = request.getHeader("token");
Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
List<String> markets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
if(!markets.contains("1")) {
refundUser.setMarkets(markets);
}
}
Gold gold = refundService.statsGold(refundUser);
return Result.success(gold);
@ -135,4 +137,20 @@ public class RefundController {
return Result.error("请检查数据的格式");
}
}
public Result selcet(@RequestBody Page page) {
try {
if (ObjectUtils.isEmpty(page.getPageNum())) {
return Result.error("页码数为空!");
}
if (ObjectUtils.isEmpty(page.getPageSize())) {
return Result.error("页大小为空!");
} else {
return Result.success(refundService.selectBy(page.getPageNum(), page.getPageSize(), page.getRefundUser()));
}
} catch (Exception e) {
return Result.error("请检查筛选数据的格式");
}
}
}

2
src/main/java/com/example/demo/controller/coin/WorkbenchController.java

@ -57,7 +57,7 @@ public class WorkbenchController {
List<String> markets = workbenchService.getAdminMarket(account);
WorkbenchCard result;
//判断是否是总部
if (markets != null && markets.contains("总部")) {
if (markets != null && markets.contains("1")) {
result = workbenchService.getCardCache(markets);//走缓存拿全部市场的缓存数据
} else {
result = workbenchService.getCard(markets);//不走缓存计算卡片属性

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

@ -0,0 +1,37 @@
package com.example.demo.domain.DTO;
import com.example.demo.domain.vo.bean.BeanConsumeLive;
import com.example.demo.domain.vo.coin.ConsumeUser;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: GOLD
* @ClassName LiveDTO
* @description:
* @author: huangqizhen
* @create: 202507-31 17:28
* @Version 1.0
**/
@Data
@NoArgsConstructor
public class LiveDTO {
private String token;
private String url = "";
private String fileName = "";
private Integer sort = 0;
private String field = "";
private Integer account;
private Integer type = 6; //类型
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 BeanConsumeLive beanConsumeLive;
}

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

@ -0,0 +1,41 @@
package com.example.demo.domain.vo.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @program: gold-java
* @ClassName BeanConsumeArticle
* @description:
* @author: Ethan
* @create: 202507-31 17:05
* @Version 1.0
**/
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeArticle {
private static final long serialVersionUID = 1L;
private String name; //姓名
private Integer jwcode; //精网号
private String dept; //地区/分部
private String type; //类型source_type 910打赏11付费
private Integer payMode; // 0 打赏 1 付费 2 其他
private String beanNum; //金豆数量
private Integer articleId; //文章/视频ID
private String articleName; //文章/视频标题source_name
private String author; //作者
private String payType; //支付类型 1-5:直播 7铁粉 8文章
private String sortField; //排序字段
private String sortOrder; //排序顺序
@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")
private Date startTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
}

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

@ -0,0 +1,38 @@
package com.example.demo.domain.vo.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* @program: gold-java
* @ClassName BeanConsumeFan
* @description:
* @author: Ethan
* @create: 202507-31 11:30
* @Version 1.0
**/
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeFan {
private static final long serialVersionUID = 1L;
private String name; //姓名
private Integer jwcode; //精网号
private String dept; //地区/分部
private String beanNum; //金豆数量
private String channel; //频道名称source_name
private String type; //类型source_type 单月连续包月
private Integer payType; //支付方式直播12345铁粉7文章8
private String sortField; //排序字段
private String sortOrder; //排序顺序
@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")
private Date startTime; // 开始时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
}

23
src/main/java/com/example/demo/domain/vo/bean/BeanConsumeGold.java

@ -0,0 +1,23 @@
package com.example.demo.domain.vo.bean;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: gold-java
* @ClassName BeanConsumeGold
* @description:
* @author: Ethan
* @create: 202507-30 16:12
* @Version 1.0
**/
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeGold {
private static final long serialVersionUID = 1L;
private Integer permanentBean ; //付费金豆
private Integer freeBean ; //免费金豆
private Integer totalNum; //总条数
}

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

@ -0,0 +1,43 @@
package com.example.demo.domain.vo.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanConsume
* @description:
* @author: Ethan
* @create: 202507-30 10:41
* @Version 1.0
**/
@Data
@NoArgsConstructor
@JsonIgnoreProperties(ignoreUnknown = true)
public class BeanConsumeLive {
private static final long serialVersionUID = 1L;
private String name; //姓名
private Integer jwcode; //精网号
private String dept; //地区/分部
//类型 直播 1. 发礼物2. 发红包3. 发福袋4. 付费直播5. 加入粉丝团6. 发弹幕
//文章 1. 打赏2. 付费
private String type; //类型
private String gift; //礼物名称
private String beanNum; //金豆数量
private String liveChannel; //频道名称截取content
private String liveName; //直播间名称
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date consumeTime; // 消费时间 时间戳转化
private Integer payType; //支付方式直播12345铁粉7文章8
private String sortField; //排序字段
private String sortOrder; //排序顺序
@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")
private Date endTime; // 结束时间
}

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

@ -1,5 +1,9 @@
package com.example.demo.domain.vo.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: gold-java
* @ClassName BeanRecharge
@ -9,5 +13,15 @@ package com.example.demo.domain.vo.bean;
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanRecharge {
private Integer id;//id
private Integer jwcode; // 精网号
private Integer freeBean; // 免费豆
private Integer permanentBean; // 永久豆
private String remark; //备注
private Integer money; // 金额
private String adminName; // 管理员名称
}

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

@ -0,0 +1,47 @@
package com.example.demo.domain.vo.bean;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanRecharge
* @description:
* @author: Double
* @create: 202507-30 15:11
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanRechargeInfo {
private Long id;//id
private Integer jwcode; // 精网号
private String name; // 姓名
private String market; // 所属地区
private Integer freeBean; // 免费豆
private Integer permanentBean; // 永久豆
private Double money; // 金额
private Integer num; // 数量
private Double amount; // 金额
private String orderNo; // 订单号
private String remark; //备注
private String platform; // 充值平台
@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")
private Date endTime; // 结束时间
private List<String> markets; // 地区列表
private String sortField; //排序字段
private String sortOrder; //排序顺序
}

28
src/main/java/com/example/demo/domain/vo/bean/BeanUser.java

@ -0,0 +1,28 @@
package com.example.demo.domain.vo.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: gold-java
* @ClassName BeanUser
* @description:
* @author: Ethan
* @create: 202508-01 10:40
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanUser {
private String name; //姓名
private Integer jwcode; //精网号
private String dept; //分部
private Integer beanNum; //金豆数量
private Integer buyBean; //付费金豆
private Integer freeBean; //免费金豆
private Integer totalCostBean; //历史消费
private String sortField; //排序字段
private String sortOrder; //排序顺序
}

3
src/main/java/com/example/demo/domain/vo/bean/BeanUserCard.java

@ -22,7 +22,8 @@ public class BeanUserCard {
private String name; // 客户姓名
private Integer jwcode; // 精网号
private String market; // 所属地区
private Integer sumBean; // 所有金豆
private Integer freeBean; // 免费豆
private Integer permanentBean; // 永久豆
private Integer consumeNum; // 消费次数
private Integer consumeSum; // 消费金额
}

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

@ -0,0 +1,24 @@
package com.example.demo.domain.vo.bean;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @program: gold-java
* @ClassName GoldBean
* @description:
* @author: Double
* @create: 202507-31 13:10
* @Version 1.0
**/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GoldBean {
private Integer freeBean; // 免费豆
private Integer permanentBean; // 永久豆
private Double money; // 金额
private Integer beanNum; // 豆数量
}

2
src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java

@ -68,6 +68,6 @@ public class ConsumeUser implements Serializable {
private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序
@ExcelIgnore
private List<String> markets; // 地区列表
}

2
src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java

@ -57,7 +57,7 @@ public class GoldDetail {
private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序
@ExcelIgnore
@ExcelProperty("更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date auditTime;
@ExcelIgnore

9
src/main/java/com/example/demo/domain/vo/coin/Page.java

@ -1,6 +1,7 @@
package com.example.demo.domain.vo.coin;
import com.example.demo.domain.entity.User;
import com.example.demo.domain.vo.bean.*;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -29,4 +30,12 @@ public class Page {
private RefundAudit refundAudit;
private RechargeUser rechargeUser;
private RoleVo roleVo;
private Integer payType; //支付方式直播12345铁粉7文章8
private BeanConsumeLive beanConsumeLive; //直播金豆消费
private BeanConsumeFan beanConsumeFan; //铁粉金豆消费
private BeanConsumeArticle beanConsumeArticle; //文章金豆消费
private BeanRechargeInfo beanRechargeInfo; //金豆充值信息
private BeanConsumeGold beanConsumeGold; //金豆消费合计数
private BeanUser beanUser; //客户金豆余额明细
private BeanUserCard beanUserCard; //客户金豆卡片
}

42
src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java

@ -25,64 +25,64 @@ public class RechargeUser {
private static final long serialVersionUID = 1L;
// @ExcelProperty("客户姓名")
@ExcelProperty("客户姓名")
private String name; // 客户姓名
// @ExcelProperty("精网号")
@ExcelProperty("精网号")
private Integer jwcode; // 精网号
// @ExcelProperty("所属地区")
@ExcelProperty("所属地区")
private String market; // 所属地区
// @ExcelProperty("活动名称")
@ExcelProperty("活动名称")
private String activity; // 活动名称
// @ExcelProperty("汇率ID")
@ExcelProperty("汇率ID")
private Integer rateId; // 汇率ID
// @ExcelProperty("汇率名称")
@ExcelProperty("汇率名称")
private String rateName; // 汇率名称
// @ExcelProperty("金额[分]")
@ExcelProperty("金额[分]")
private Integer money; // 金额[]
// @ExcelProperty("永久金币")
@ExcelProperty("永久金币")
private Integer permanentGold; // 永久金币
// @ExcelProperty("免费金币")
@ExcelProperty("免费金币")
private Integer freeGold; // 免费金币
// @ExcelProperty("支付方式")
@ExcelProperty("支付方式")
private String payModel; // 支付方式
// @ExcelProperty("支付平台")
@ExcelProperty("支付平台")
private String payPlatform; // 支付平台
// @ExcelProperty("支付凭证")
@ExcelProperty("支付凭证")
private String voucher; // 支付凭证
// @ExcelProperty("备注")
@ExcelProperty("备注")
private String remark; // 备注
// @ExcelProperty("提交人Id")
@ExcelProperty("提交人Id")
private Integer adminId; // 提交人Id
// @ExcelProperty("提交人姓名")
@ExcelProperty("提交人姓名")
private String adminName; // 提交人姓名
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
// @ExcelProperty("创建时间")
@ExcelProperty("创建时间")
private Date payTime; // 创建时间
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
// @ExcelIgnore
@ExcelIgnore
private Date startTime; // 开始时间
// @ExcelIgnore
@ExcelIgnore
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "Asia/Shanghai")
private Date endTime; // 结束时间
// @ExcelIgnore
@ExcelIgnore
private String sortField; //排序字段
// @ExcelIgnore
@ExcelIgnore
private String sortOrder; //排序顺序
@ExcelIgnore
private List<String> markets; // 地区列表
}

2
src/main/java/com/example/demo/domain/vo/coin/RefundUser.java

@ -68,6 +68,6 @@ public class RefundUser {
private String sortField; //排序字段
@ExcelIgnore
private String sortOrder; //排序顺序
@ExcelIgnore
private List<String> markets; // 地区列表
}

40
src/main/java/com/example/demo/mapper/bean/BeanConsumeMapper.java

@ -0,0 +1,40 @@
package com.example.demo.mapper.bean;
import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.coin.RechargeAudit;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanConsumeMapper.xml
* @description:
* @author: Ethan
* @create: 202507-30 11:56
* @Version 1.0
**/
@Mapper
public interface BeanConsumeMapper {
//获取消费用户分部
List<String> getDept();
//筛选查询直播消费
List<BeanConsumeLive> selectLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive);
//筛选查询铁粉消费
List<BeanConsumeFan> selectFanBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan);
//筛选查询文章消费
List<BeanConsumeArticle> selectArticleBy(@Param("beanConsumeArticle") BeanConsumeArticle beanConsumeArticle);
//查询金豆直播消费金额
BeanConsumeGold selectSumLiveBy(@Param("beanConsumeLive") BeanConsumeLive beanConsumeLive);
//查询金豆铁粉消费金额
BeanConsumeGold selectSumFansBy(@Param("beanConsumeFan") BeanConsumeFan beanConsumeFan);
//查询金豆文章消费金额
BeanConsumeGold selectSumArticleBy(@Param("beanConsumeArticle") BeanConsumeArticle beanConsumeArticle);
//查询直播礼物
List<String> getLiveGift();
//查询直播全部频道
List<String> getLiveChannel();
}

14
src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper.java

@ -1,14 +0,0 @@
package com.example.demo.mapper.bean;
/**
* @program: gold-java
* @ClassName BeanRechargeMapper
* @description:
* @author: Double
* @create: 202507-29 16:46
* @Version 1.0
**/
public interface BeanRechargeMapper {
}

24
src/main/java/com/example/demo/mapper/bean/BeanRechargeMapper2.java

@ -0,0 +1,24 @@
package com.example.demo.mapper.bean;
import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanRechargeMapper
* @description:
* @author: Double
* @create: 202507-30 15:43
* @Version 1.0
**/
@Mapper
public interface BeanRechargeMapper2 {
List<BeanRechargeInfo> selectBySystem(BeanRechargeInfo beanRechargeInfo);
List<String> systemMarket();
}

8
src/main/java/com/example/demo/mapper/bean/BeanUserMapper.java

@ -1,6 +1,7 @@
package com.example.demo.mapper.bean;
import com.example.demo.domain.vo.bean.BeanUser;
import com.example.demo.domain.vo.bean.BeanUserCard;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@ -18,6 +19,13 @@ import java.util.List;
@Mapper
public interface BeanUserMapper {
//查询客户金豆余额
List<BeanUser> selectUserBy(@Param("beanUser") BeanUser beanUser);
//查询用户卡片
BeanUserCard userCard(@Param("jwcode")String jwcode, @Param("markets")List<String> markets);
//查询客户金豆余额合计
BeanUserCard SumUserBy(@Param("beanUser")BeanUser beanUser);
//查询客户分部
List<String> getDept();
}

20
src/main/java/com/example/demo/mapper/coin/BeanRechargeMapper1.java

@ -0,0 +1,20 @@
package com.example.demo.mapper.coin;
import com.example.demo.domain.vo.bean.BeanRecharge;
import org.apache.ibatis.annotations.Mapper;
/**
* @program: gold-java
* @ClassName BeanRechargeMapper
* @description:
* @author: Double
* @create: 202507-30 15:43
* @Version 1.0
**/
@Mapper
public interface BeanRechargeMapper1 {
int add(BeanRecharge recharge);
}

13
src/main/java/com/example/demo/mapper/coin/PermissionMapper.java

@ -3,7 +3,6 @@ package com.example.demo.mapper.coin;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.AdminRole;
import com.example.demo.domain.entity.Role;
import com.example.demo.domain.vo.coin.AdminVo;
import com.example.demo.domain.vo.coin.Permission;
import org.apache.ibatis.annotations.Mapper;
@ -30,4 +29,16 @@ public interface PermissionMapper {
// Integer deleteAdminRole(Integer id);
Integer updateAdminRole(AdminRole adminRole);
Integer updateAdmin(Admin admin);
/**
* @program: gold-java
* @ClassName BeanConsumeMapper.xml
* @description:
* @author: Ethan
* @create: 202507-30 11:55
* @Version 1.0
**/
interface BeanConsumeMapper {
}
}

24
src/main/java/com/example/demo/mapper/pay/BeanRechargeMapper3.java

@ -0,0 +1,24 @@
package com.example.demo.mapper.pay;
import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanRechargeMapper
* @description:
* @author: Double
* @create: 202507-30 15:43
* @Version 1.0
**/
@Mapper
public interface BeanRechargeMapper3 {
List<BeanRechargeInfo> selectByOnline(BeanRechargeInfo beanRechargeInfo);
List<String> systemMarket();
}

35
src/main/java/com/example/demo/service/bean/BeanConsumeService.java

@ -0,0 +1,35 @@
package com.example.demo.service.bean;
import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.Page;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanConsumeService
* @description:
* @author: Ethan
* @create: 202507-30 11:53
* @Version 1.0
**/
public interface BeanConsumeService {
//获取消费用户的分部
List<String> getDept();
//筛选查询直播消费
Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive);
//筛选查询铁粉消费
Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan);
//筛选查询文章消费
Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle);
//消费金币合计数
BeanConsumeGold sumConsumeGold(Page page);
//查询直播礼物
List<String> getLiveGift();
//获取直播频道
List<String> getLiveChannel();
}

30
src/main/java/com/example/demo/service/bean/BeanRechargeService.java

@ -1,6 +1,15 @@
package com.example.demo.service.bean;
import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import com.example.demo.domain.vo.bean.GoldBean;
import com.example.demo.domain.vo.coin.RefundUser;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.domain.vo.bean.BeanRecharge;
import com.github.pagehelper.PageInfo;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanRechargeService
@ -11,4 +20,25 @@ package com.example.demo.service.bean;
**/
public interface BeanRechargeService {
//线上充值
Result add(BeanRecharge recharge);
//系统充值
PageInfo<BeanRechargeInfo> selectBySystem(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo);
//系统金豆统计
GoldBean statsSystemBean(BeanRechargeInfo beanRechargeInfo);
//线上充值
PageInfo<BeanRechargeInfo> selectByOnline(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo);
//线上金豆统计
GoldBean statsOnlineBean(BeanRechargeInfo beanRechargeInfo);
//获取系统充值地区
List<String> systemMarket();
//获取线上充值地区
List<String> onlineMarket();
}

11
src/main/java/com/example/demo/service/bean/BeanUserService.java

@ -2,9 +2,13 @@ package com.example.demo.service.bean;
import com.example.demo.domain.vo.bean.BeanUser;
import com.example.demo.domain.vo.bean.BeanUserCard;
import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanUserService
@ -17,4 +21,11 @@ import com.example.demo.domain.vo.coin.Result;
public interface BeanUserService {
//查询用户卡片
Result userCard(String jwcode);
//查询客户金豆余额
Object selectUserBy(Integer pageNum, Integer pageSize, BeanUser beanUser);
//客户金豆余额合计数
BeanUserCard sumUserGold(Page page);
//客户 部门
List<String> getDept();
}

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

@ -1,8 +1,12 @@
package com.example.demo.service.coin;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.function.Function;
/**
* @program: GOLD
@ -18,5 +22,10 @@ public interface ExportExcelService {
Exception rechargeExcel(String message) throws Exception;
Exception consumeExcel(String message) throws Exception;
Exception refundExcel(String message) throws Exception;
Exception LiveExcel(String message) throws Exception;
List<Export> getExcel(Export export);
@Transactional
Exception exportExcelGeneric(String message, String exportType, Function<Page, Result> dataFetcher) throws Exception;
}

84
src/main/java/com/example/demo/service/listen/AiEmotionExportListener.java

@ -1,84 +0,0 @@
package com.example.demo.service.listen;
import cn.hutool.core.util.StrUtil;
import com.example.demo.Util.ExecutionContextUtil;
import com.example.demo.Util.FeiShuAlertUtil;
import com.example.demo.Util.RedisUtil;
import com.example.demo.domain.vo.coin.ExecutionContext;
import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.service.queue.AbstractMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static java.lang.Thread.sleep;
@Component
public class AiEmotionExportListener extends AbstractMessageListener<String> {
//注入ExportExcelService
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public AiEmotionExportListener(
RedisUtil redisQueueUtil
) {
super(redisQueueUtil, "hwgold:queue:export_queue");
System.out.println("监听器已启动,队列: ");
}
@Override
protected void handleMessage(String message) {
if (StrUtil.isBlank(message)) {
System.err.println("redis消息队列数据为空" + message);
}
try {
Thread.sleep(5000);
exportExcelService.handleExcelExportData(message);
} catch (Exception e) {
logError(e, message);
throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e);
}
}
private void logError(Exception e, String message) {
System.err.println("Export data listener exception: " + e.getMessage());
e.printStackTrace();
try {
ExecutionContext context = ExecutionContextUtil.getExecutionContext();
String cause = "";
if (e.getCause() != null) {
cause = e.getCause().getMessage();
}
FeiShuAlertUtil.sendAlertMessage(
context,
e.getStackTrace()[0].getFileName(),
e.getStackTrace()[0].getLineNumber(),
"HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause ,
"Failed message: " + message
);
} catch (Exception alertEx) {
System.err.println("Failed to send Feishu alert: " + alertEx.getMessage());
}
}
@Override
protected void handleError(Exception e, String message) {
System.err.println("处理消息失败: " + message);
e.printStackTrace();
}
}

67
src/main/java/com/example/demo/service/listen/BaseMessageListener.java

@ -0,0 +1,67 @@
package com.example.demo.service.listen;
import cn.hutool.core.util.StrUtil;
import com.example.demo.Util.ExecutionContextUtil;
import com.example.demo.Util.FeiShuAlertUtil;
import com.example.demo.Util.RedisUtil;
import com.example.demo.domain.vo.coin.ExecutionContext;
import com.example.demo.service.queue.AbstractMessageListener;
public abstract class BaseMessageListener<T> extends AbstractMessageListener<T> {
protected BaseMessageListener(RedisUtil redisQueueUtil, String queueName) {
super(redisQueueUtil, queueName);
System.out.println("监听器已启动,队列: " + queueName);
}
@Override
protected void handleError(Exception e, T message) {
handleException(e, message.toString()); // 统一异常处理
}
/**
* 验证消息是否为空
*/
protected void validateMessage(T message) {
if (message == null || (message instanceof String && StrUtil.isBlank((String) message))) {
throw new IllegalArgumentException("Redis消息队列数据为空: " + message);
}
}
/**
* 统一异常处理
*/
protected void handleException(Exception e, String message) {
logError(e, message); // 记录错误日志
sendAlert(e, message); // 发送告警通知
throw new RuntimeException("Failed to process message: " + e.getMessage(), e);
}
/**
* 记录错误日志
*/
protected void logError(Exception e, String message) {
System.err.println("Message listener exception: " + e.getMessage());
e.printStackTrace();
}
/**
* 发送告警通知
*/
protected void sendAlert(Exception e, String message) {
try {
ExecutionContext context = ExecutionContextUtil.getExecutionContext();
String cause = e.getCause() != null ? e.getCause().getMessage() : "";
FeiShuAlertUtil.sendAlertMessage(
context,
e.getStackTrace()[0].getFileName(),
e.getStackTrace()[0].getLineNumber(),
"Message Listener Error: " + e.getMessage() + " 底层错误: " + cause,
"Failed message: " + message
);
} catch (Exception alertEx) {
System.err.println("Failed to send Feishu alert: " + alertEx.getMessage());
}
}
}

42
src/main/java/com/example/demo/service/listen/ConsumeListener.java

@ -19,62 +19,28 @@ import org.springframework.stereotype.Component;
* @Version 1.0
**/
@Component
public class ConsumeListener extends AbstractMessageListener<String> {
public class ConsumeListener extends BaseMessageListener<String> {
//注入ExportExcelService
@Autowired
private ExportExcelService exportService;
@Autowired
public ConsumeListener(
RedisUtil redisQueueUtil
) {
public ConsumeListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "consume:queue:export_queue");
System.out.println("监听器已启动,队列: ");
}
@Override
protected void handleMessage(String message) {
if (StrUtil.isBlank(message)) {
System.err.println("redis消息队列数据为空" + message);
}
validateMessage( message);
try {
Thread.sleep(5000);
exportService.consumeExcel(message);
} catch (Exception e) {
logError(e, message);
throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e);
handleException(e, message);
}
}
private void logError(Exception e, String message) {
System.err.println("Export data listener exception: " + e.getMessage());
e.printStackTrace();
try {
ExecutionContext context = ExecutionContextUtil.getExecutionContext();
String cause = "";
if (e.getCause() != null) {
cause = e.getCause().getMessage();
}
FeiShuAlertUtil.sendAlertMessage(
context,
e.getStackTrace()[0].getFileName(),
e.getStackTrace()[0].getLineNumber(),
"HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause ,
"Failed message: " + message
);
} catch (Exception alertEx) {
System.err.println("Failed to send Feishu alert: " + alertEx.getMessage());
}
}
@Override
protected void handleError(Exception e, String message) {
System.err.println("处理消息失败: " + message);
e.printStackTrace();
}
}

50
src/main/java/com/example/demo/service/listen/GoldDetailListener.java

@ -0,0 +1,50 @@
package com.example.demo.service.listen;
import cn.hutool.core.util.StrUtil;
import com.example.demo.Util.ExecutionContextUtil;
import com.example.demo.Util.FeiShuAlertUtil;
import com.example.demo.Util.RedisUtil;
import com.example.demo.domain.vo.coin.ExecutionContext;
import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.service.queue.AbstractMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import static java.lang.Thread.sleep;
@Component
public class GoldDetailListener extends BaseMessageListener<String> {
//注入ExportExcelService
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public GoldDetailListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "hwgold:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.handleExcelExportData(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

43
src/main/java/com/example/demo/service/listen/GoldListener.java

@ -20,62 +20,27 @@ import org.springframework.stereotype.Component;
* @Version 1.0
**/
@Component
public class GoldListener extends AbstractMessageListener<String> {
public class GoldListener extends BaseMessageListener<String> {
//注入ExportExcelService
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public GoldListener(
RedisUtil redisQueueUtil
) {
public GoldListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "gold:queue:export_queue");
System.out.println("监听器已启动,队列: ");
}
@Override
protected void handleMessage(String message) {
if (StrUtil.isBlank(message)) {
System.err.println("redis消息队列数据为空" + message);
}
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.handleExcel(message);
} catch (Exception e) {
logError(e, message);
throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e);
handleException(e, message);
}
}
private void logError(Exception e, String message) {
System.err.println("Export data listener exception: " + e.getMessage());
e.printStackTrace();
try {
ExecutionContext context = ExecutionContextUtil.getExecutionContext();
String cause = "";
if (e.getCause() != null) {
cause = e.getCause().getMessage();
}
FeiShuAlertUtil.sendAlertMessage(
context,
e.getStackTrace()[0].getFileName(),
e.getStackTrace()[0].getLineNumber(),
"HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause ,
"Failed message: " + message
);
} catch (Exception alertEx) {
System.err.println("Failed to send Feishu alert: " + alertEx.getMessage());
}
}
@Override
protected void handleError(Exception e, String message) {
System.err.println("处理消息失败: " + message);
e.printStackTrace();
}
}

38
src/main/java/com/example/demo/service/listen/LiveListener.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;
/**
* @program: GOLD
* @ClassName LiveListener
* @description:
* @author: huangqizhen
* @create: 202507-31 17:53
* @Version 1.0
**/
@Component
public class LiveListener extends BaseMessageListener<String>{
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public LiveListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "live:queue:export_queue");
}
@Override
protected void handleMessage(String message) {
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.LiveExcel(message);
} catch (Exception e) {
handleException(e, message);
}
}
}

66
src/main/java/com/example/demo/service/listen/RechargeListener.java

@ -1,80 +1,32 @@
package com.example.demo.service.listen;
import cn.hutool.core.util.StrUtil;
import com.example.demo.Util.ExecutionContextUtil;
import com.example.demo.Util.FeiShuAlertUtil;
import com.example.demo.Util.RedisUtil;
import com.example.demo.domain.vo.coin.ExecutionContext;
import com.example.demo.service.coin.ExportExcelService;
import com.example.demo.service.queue.AbstractMessageListener;
import com.example.demo.service.listen.BaseMessageListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* @program: GOLD
* @ClassName RechargeListener
* @description:
* @author: huangqizhen
* @create: 202507-01 15:46
* @Version 1.0
**/
import static org.ehcache.core.exceptions.StorePassThroughException.handleException;
@Component
public class RechargeListener extends AbstractMessageListener<String> {
//注入ExportExcelService
public class RechargeListener extends BaseMessageListener<String> {
@Autowired
private ExportExcelService exportService;
@Autowired
public RechargeListener(
RedisUtil redisQueueUtil
) {
public RechargeListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "recharge:queue:export_queue");
System.out.println("监听器已启动,队列: ");
}
@Override
protected void handleMessage(String message) {
if (StrUtil.isBlank(message)) {
System.err.println("redis消息队列数据为空" + message);
}
validateMessage(message); // 验证消息
try {
Thread.sleep(5000);
Thread.sleep(5000); // 模拟延迟处理
exportService.rechargeExcel(message);
} catch (Exception e) {
logError(e, message);
throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e);
handleException(e, message); // 统一异常处理
}
}
private void logError(Exception e, String message) {
System.err.println("Export data listener exception: " + e.getMessage());
e.printStackTrace();
try {
ExecutionContext context = ExecutionContextUtil.getExecutionContext();
String cause = "";
if (e.getCause() != null) {
cause = e.getCause().getMessage();
}
FeiShuAlertUtil.sendAlertMessage(
context,
e.getStackTrace()[0].getFileName(),
e.getStackTrace()[0].getLineNumber(),
"HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause ,
"Failed message: " + message
);
} catch (Exception alertEx) {
System.err.println("Failed to send Feishu alert: " + alertEx.getMessage());
}
}
@Override
protected void handleError(Exception e, String message) {
System.err.println("处理消息失败: " + message);
e.printStackTrace();
}
}

44
src/main/java/com/example/demo/service/listen/RefundListener.java

@ -19,62 +19,26 @@ import org.springframework.stereotype.Component;
* @Version 1.0
**/
@Component
public class RefundListener extends AbstractMessageListener<String> {
public class RefundListener extends BaseMessageListener<String> {
//注入ExportExcelService
@Autowired
private ExportExcelService exportExcelService;
@Autowired
public RefundListener(
RedisUtil redisQueueUtil
) {
public RefundListener(RedisUtil redisQueueUtil) {
super(redisQueueUtil, "refund:queue:export_queue");
System.out.println("监听器已启动,队列: ");
}
@Override
protected void handleMessage(String message) {
if (StrUtil.isBlank(message)) {
System.err.println("redis消息队列数据为空" + message);
}
validateMessage( message);
try {
Thread.sleep(5000);
exportExcelService.refundExcel(message);
} catch (Exception e) {
logError(e, message);
throw new RuntimeException("Failed to process HWGOLD export: " + e.getMessage(), e);
handleException(e, message);
}
}
private void logError(Exception e, String message) {
System.err.println("Export data listener exception: " + e.getMessage());
e.printStackTrace();
try {
ExecutionContext context = ExecutionContextUtil.getExecutionContext();
String cause = "";
if (e.getCause() != null) {
cause = e.getCause().getMessage();
}
FeiShuAlertUtil.sendAlertMessage(
context,
e.getStackTrace()[0].getFileName(),
e.getStackTrace()[0].getLineNumber(),
"HWGOLD Export Error: " + e.getMessage() + " 底层错误: " + cause ,
"Failed message: " + message
);
} catch (Exception alertEx) {
System.err.println("Failed to send Feishu alert: " + alertEx.getMessage());
}
}
@Override
protected void handleError(Exception e, String message) {
System.err.println("处理消息失败: " + message);
e.printStackTrace();
}
}

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

@ -0,0 +1,86 @@
package com.example.demo.serviceImpl.bean;
import com.example.demo.domain.vo.bean.*;
import com.example.demo.domain.vo.coin.Gold;
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.service.bean.BeanConsumeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @program: gold-java
* @ClassName BeanConsumeServiceImpl
* @description:
* @author: Ethan
* @create: 202507-30 11:53
* @Version 1.0
**/
@Service
public class BeanConsumeServiceImpl implements BeanConsumeService {
@Autowired
private BeanConsumeMapper BeanConsumeMapper;
//获取消费用户分部
@Override
public List<String> getDept() {
List<String> deptList = BeanConsumeMapper.getDept();
return deptList;
}
//筛选查询直播消费
@Override
public Object selectLiveBy(Integer pageNum, Integer pageSize, BeanConsumeLive beanConsumeLive) {
PageHelper.startPage(pageNum, pageSize);
List<BeanConsumeLive> beanConsumeLives = BeanConsumeMapper.selectLiveBy(beanConsumeLive);
return new PageInfo<>(beanConsumeLives);
}
//筛选查询铁粉消费
@Override
public Object selectFanBy(Integer pageNum, Integer pageSize, BeanConsumeFan beanConsumeFan) {
PageHelper.startPage(pageNum, pageSize);
List<BeanConsumeFan> beanConsumeFans = BeanConsumeMapper.selectFanBy(beanConsumeFan);
return new PageInfo<>(beanConsumeFans);
}
//筛选查询文章消费
@Override
public Object selectArticleBy(Integer pageNum, Integer pageSize, BeanConsumeArticle beanConsumeArticle) {
PageHelper.startPage(pageNum, pageSize);
List<BeanConsumeArticle> beanConsumeArticles = BeanConsumeMapper.selectArticleBy(beanConsumeArticle);
return new PageInfo<>(beanConsumeArticles);
}
@Override
public BeanConsumeGold sumConsumeGold(Page page) {
BeanConsumeGold gold = new BeanConsumeGold();
Integer payType = page.getPayType();
if (payType==1) {
//直播消费合计
gold = BeanConsumeMapper.selectSumLiveBy(page.getBeanConsumeLive());
}else if (payType==7) {
//充值消费合计
gold = BeanConsumeMapper.selectSumFansBy(page.getBeanConsumeFan());
}else if (payType==8) {
//文章消费合计
gold = BeanConsumeMapper.selectSumArticleBy(page.getBeanConsumeArticle());
}
return gold;
}
//查询直播礼物
@Override
public List<String> getLiveGift() {
return BeanConsumeMapper.getLiveGift();
}
//查询直播全部频道
@Override
public List<String> getLiveChannel() {
return BeanConsumeMapper.getLiveChannel();
}
}

199
src/main/java/com/example/demo/serviceImpl/bean/BeanRechargeServiceImpl.java

@ -1,6 +1,28 @@
package com.example.demo.serviceImpl.bean;
import com.example.demo.domain.vo.bean.BeanRecharge;
import com.example.demo.domain.vo.bean.BeanRechargeInfo;
import com.example.demo.domain.vo.bean.GoldBean;
import com.example.demo.domain.vo.coin.Gold;
import com.example.demo.domain.vo.coin.RechargeUser;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.bean.BeanRechargeMapper2;
import com.example.demo.mapper.coin.BeanRechargeMapper1;
import com.example.demo.mapper.pay.BeanRechargeMapper3;
import com.example.demo.service.bean.BeanRechargeService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* @program: gold-java
@ -10,7 +32,180 @@ import org.springframework.stereotype.Service;
* @create: 202507-29 16:47
* @Version 1.0
**/
@Service
public class BeanRechargeServiceImpl {
@RequiredArgsConstructor
public class BeanRechargeServiceImpl implements BeanRechargeService {
@Autowired
private RestTemplate restTemplate;
@Autowired
private BeanRechargeMapper2 beanRechargeMapper2;
@Autowired
private BeanRechargeMapper1 beanRechargeMapper1;
@Autowired
private BeanRechargeMapper3 beanRechargeMapper3;
//新增金豆
@Override
public Result add(BeanRecharge recharge) {
try {
// 验证精网号是否有效
if (recharge.getJwcode() == null || recharge.getJwcode().toString().isEmpty()) {
return Result.error("精网号不能为空");
}
// 验证免费豆和永久豆是否为非负数
if (recharge.getFreeBean() < 0 || recharge.getPermanentBean() < 0) {
return Result.error("免费豆和永久豆不能为负数");
}
// 验证免费豆和永久豆是否为非负数
if (recharge.getFreeBean() > 999999 || recharge.getPermanentBean() > 999999) {
return Result.error("免费豆和永久豆不能超过999999");
}
// 验证免费豆和永久豆是否均为0
if (recharge.getFreeBean() == 0 && recharge.getPermanentBean() == 0) {
return Result.error("免费豆和永久豆不能同时为0");
}
// 验证备注是否为空
if (recharge.getRemark() == null || recharge.getRemark().toString().isEmpty()) {
return Result.error("备注不能为空");
}
if(recharge.getAdminName() == null || recharge.getAdminName().toString().isEmpty()){
return Result.error("管理员名称不能为空");
}
beanRechargeMapper1.add(recharge);
// String jwcode = recharge.getJwcode().toString();
// String op = "recharge"; // 操作类型根据实际业务定义例如"recharge"表示充值
// String content = recharge.getRemark(); // 备注作为content参数
// String orderNo = UUID.randomUUID().toString().replace("-", ""); // 生成唯一订单号去除横线
//
// // 2. 构建接口URL及参数
// String apiUrl = "http://47.92.148.30:3003/mock/61/hljw/api/user/gold";
// UriComponentsBuilder urlBuilder = UriComponentsBuilder.fromHttpUrl(apiUrl)
// .queryParam("jwcode", jwcode)
// .queryParam("op", op)
// .queryParam("gold", recharge.getPermanentBean())
// .queryParam("content", content)
// .queryParam("order_no", orderNo);
//
// // 3. 发送GET请求
// ResponseEntity<String> response = restTemplate.getForEntity(urlBuilder.toUriString(), String.class);
//
// // 4. 处理响应结果
// if (!response.getStatusCode().is2xxSuccessful()) {
// return Result.error("远程接口调用失败,状态码:" + response.getStatusCodeValue());
// }
return Result.success("添加成功");
} catch (Exception e) {
return Result.error("系统异常:" + e.getMessage());
}
}
//系统充值明细
@Override
public PageInfo<BeanRechargeInfo> selectBySystem(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo){
PageHelper.startPage(pageNum, pageSize);
List<BeanRechargeInfo> beanRechargeInfos = beanRechargeMapper2.selectBySystem(beanRechargeInfo);
return new PageInfo<>(beanRechargeInfos);
}
//统计系统金豆记录
@Override
public GoldBean statsSystemBean(BeanRechargeInfo beanRechargeInfo) {
GoldBean gold = new GoldBean();
List<BeanRechargeInfo> beanRechargeInfos = beanRechargeMapper2.selectBySystem(beanRechargeInfo);
// 初始化累加器
int permanentGoldSum = 0;
int freeGoldSum = 0;
Double moneySum = 0.0;
// 遍历充值记录并累加金币
for (BeanRechargeInfo info : beanRechargeInfos) {
// 累加永久金币
if (info.getPermanentBean() != null) {
permanentGoldSum += info.getPermanentBean();
}
// 累加免费金币
if (info.getFreeBean() != null) {
freeGoldSum += info.getFreeBean();
}
// 累加金额
if (info.getMoney() != null) {
moneySum += info.getMoney();
}
}
// 将累加结果设置到Gold对象
gold.setPermanentBean(permanentGoldSum);
gold.setFreeBean(freeGoldSum);
gold.setMoney(moneySum);
gold.setBeanNum(permanentGoldSum+freeGoldSum);
return gold;
}
@Override
public List<String> systemMarket() {
List<String> list = beanRechargeMapper2.systemMarket();
// 使用 Java 8 Stream API 过滤 null 和空字符串
List<String> filteredList = list.stream()
.filter(Objects::nonNull) // 过滤掉 null
.filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串
.collect(Collectors.toList());
return filteredList;
}
//线上充值明细
@Override
public PageInfo<BeanRechargeInfo> selectByOnline(Integer pageNum, Integer pageSize, BeanRechargeInfo beanRechargeInfo){
PageHelper.startPage(pageNum, pageSize);
List<BeanRechargeInfo> beanRechargeInfos = beanRechargeMapper3.selectByOnline(beanRechargeInfo);
return new PageInfo<>(beanRechargeInfos);
}
//统计线上金豆记录
@Override
public GoldBean statsOnlineBean(BeanRechargeInfo beanRechargeInfo) {
GoldBean gold = new GoldBean();
List<BeanRechargeInfo> beanRechargeInfos = beanRechargeMapper3.selectByOnline(beanRechargeInfo);
// 初始化累加器
int countSum = 0;
Double moneySum = 0.0;
// 遍历充值记录并累加金币
for (BeanRechargeInfo info : beanRechargeInfos) {
// 累加数量
if (info.getNum() != null) {
countSum += info.getNum();
}
// 累加金额
if (info.getMoney() != null) {
moneySum += info.getMoney();
}
}
// 将累加结果设置到Gold对象
gold.setBeanNum(countSum);
gold.setMoney(moneySum);
return gold;
}
@Override
public List<String> onlineMarket() {
List<String> list = beanRechargeMapper3.systemMarket();
// 使用 Java 8 Stream API 过滤 null 和空字符串
List<String> filteredList = list.stream()
.filter(Objects::nonNull) // 过滤掉 null
.filter(str -> !str.trim().isEmpty()) // 过滤掉空字符串和仅包含空白字符的字符串
.collect(Collectors.toList());
return filteredList;
}
}

22
src/main/java/com/example/demo/serviceImpl/bean/BeanUserServiceImpl.java

@ -2,10 +2,15 @@ package com.example.demo.serviceImpl.bean;
import com.example.demo.Util.JWTUtil;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.vo.bean.BeanConsumeArticle;
import com.example.demo.domain.vo.bean.BeanUser;
import com.example.demo.domain.vo.bean.BeanUserCard;
import com.example.demo.domain.vo.coin.Page;
import com.example.demo.domain.vo.coin.Result;
import com.example.demo.mapper.bean.BeanUserMapper;
import com.example.demo.service.bean.BeanUserService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -51,4 +56,21 @@ public class BeanUserServiceImpl implements BeanUserService {
return Result.error("用户查找不到");
}
}
//查询客户金豆余额
@Override
public Object selectUserBy(Integer pageNum, Integer pageSize, BeanUser beanUser) {
PageHelper.startPage(pageNum, pageSize);
List<BeanUser> beanUsers = beanUserMapper.selectUserBy(beanUser);
return new PageInfo<>(beanUsers);
}
//客户金豆余额合计数
@Override
public BeanUserCard sumUserGold(Page page) {
return beanUserMapper.SumUserBy(page.getBeanUser());
}
@Override
public List<String> getDept() {
return beanUserMapper.getDept();
}
}

1232
src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
File diff suppressed because it is too large
View File

10
src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java

@ -130,10 +130,10 @@ public class GeneralServiceImpl implements GeneralService {
}
List<String> list = Arrays.asList(market.split(","));
//判断是否是总部
if (list != null && list.contains("总部")) {
if (list != null && list.contains("1")) {
List<String> allMarkets = getMarket(); // 获取所有地区
allMarkets.remove("总部"); // 先移除可能存在的总部
allMarkets.add(0, "总部"); // 将总部添加到列表第一位
allMarkets.remove("1"); // 先移除可能存在的总部
allMarkets.add(0, "1"); // 将总部添加到列表第一位
list = allMarkets; // 更新list
}
return list;
@ -156,7 +156,7 @@ public class GeneralServiceImpl implements GeneralService {
}
List<String> list = Arrays.asList(market.split(","));
//判断是否是总部
if (list != null && list.contains("总部")) {
if (list != null && list.contains("1")) {
list=getMarket();//总部有所有地区的权限
}
return list;
@ -181,7 +181,7 @@ public class GeneralServiceImpl implements GeneralService {
}
List<String> list = Arrays.asList(market.split(","));
//判断是否是总部
if (list != null && list.contains("总部")) {
if (list != null && list.contains("1")) {
list=getAllRoleMarket();//总部有所有地区的权限
}
return list;

2
src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java

@ -20,7 +20,7 @@ public class MarketServiceImpl implements MarketService {
List<Market> markets = marketMapper.getMarket();
// 2. 构建树形结构根节点parentId=1
return buildTree(markets, 1);
return buildTree(markets, -1);
}
private List<Market> buildTree(List<Market> markets, Integer parentId) {
// 过滤出当前父节点的子菜单

4
src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java

@ -75,7 +75,7 @@ public class PermissionServiceImpl implements PermissionService {
if (ObjectUtils.isEmpty(admin.getMarket())) {
throw new Exception("地区为空!");
}
if (admin.getMarket().contains("总部") && admin.getMarket().size() > 1) {
if (admin.getMarket().contains("1") && admin.getMarket().size() > 1) {
throw new Exception("总部不可与其他地区共存");
}
if (ObjectUtils.isEmpty(admin.getPostiton())) {
@ -148,7 +148,7 @@ public class PermissionServiceImpl implements PermissionService {
if (ObjectUtils.isEmpty(adminVo.getMarket())) {
throw new Exception("地区为空!");
}
if (adminVo.getMarket().contains("总部") && adminVo.getMarket().size() > 1) {
if (adminVo.getMarket().contains("1") && adminVo.getMarket().size() > 1) {
throw new Exception("总部不可与其他地区共存");
}
// 校验职位是否为空管理员职位为必填项

6
src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java

@ -60,10 +60,10 @@ public class WorkbenchServiceImpl implements WorkbenchService {
}
List<String> list = Arrays.asList(market.split(","));
//判断是否是总部
if (list != null && list.contains("总部")) {
if (list != null && list.contains("1")) {
List<String> allMarkets = workBenchMapper.getMarket(); // 获取所有地区
allMarkets.remove("总部"); // 先移除可能存在的总部
allMarkets.add(0, "总部"); // 将总部添加到列表第一位
allMarkets.remove("1"); // 先移除可能存在的总部
allMarkets.add(0, "1"); // 将总部添加到列表第一位
list = allMarkets; // 更新list
}
return list;

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

@ -53,7 +53,7 @@ feishu:
url: https://open.feishu.cn/open-apis/bot/v2/hook/384c78aa-8df1-498b-9c47-04e890ed9877
server:
port: 8081
port: 10704
logging:
level:

8
src/main/resources/application-test.yml

@ -35,9 +35,9 @@ spring:
data:
redis:
database: 1
host: 18.143.76.3
port: 10703
password: Ngc0FYUTA6h3wC5J
host: localhost
port: 6379
password: 123456
lettuce:
pool:
@ -56,7 +56,7 @@ feishu:
server:
port: 10704
port: 8081
logging:
level:

8
src/main/resources/application.yml

@ -1,6 +1,6 @@
spring:
profiles:
active: dev
active: test
jackson:
deserialization:
fail-on-unknown-properties: false
@ -28,7 +28,7 @@ spring:
password: 4hHmzxZH4rF4c5xr
driver-class-name: com.mysql.cj.jdbc.Driver
hikari:
pool-name: mysql2HikariCP
pool-name: mysql3HikariCP
maximum-pool-size: 10
sqlserver1:
jdbc-url: jdbc:sqlserver://52.76.43.43:1433;databaseName=hwhcGold;encrypt=true;sslProtocol=TLSv1;trustServerCertificate=true;
@ -69,10 +69,10 @@ mybatis:
configuration:
mysql1:
map-underscore-to-camel-case: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
sqlserver1:
map-underscore-to-camel-case: true
# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
mysql2:
map-underscore-to-camel-case: true
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

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

@ -0,0 +1,336 @@
<?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.bean.BeanConsumeMapper">
<!--获取消费用户分部-->
<select id="getDept" resultType="java.lang.String">
select distinct fm.dept
from fx_member fm
inner join fx_yaoqing_records fyr on fyr.uid = fm.id
where fm.dept is not null and fm.dept != ''
</select>
<!--筛选查询直播消费-->
<select id="selectLiveBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeLive">
SELECT *
FROM (
SELECT fm.nickname AS name,
fm.jwcode,
fm.dept,
fyr.source_type AS type,
CASE
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0
THEN SUBSTRING(content, LOCATE('送礼物', content) + CHAR_LENGTH('送礼物'))
ELSE NULL
END AS gift,
fyr.money AS beanNum,
CASE
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0
THEN SUBSTRING_INDEX(SUBSTRING(content, LOCATE('直播间', content) + CHAR_LENGTH('直播间')), '送礼物', 1)
ELSE NULL
END AS liveChannel,
fyr.source_name AS liveName,
FROM_UNIXTIME(fyr.time, '%Y-%m-%d %H:%i:%s') AS consumeTime,
fyr.pay_type AS payType
FROM fx_member fm
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id
<where>
fyr.pay_type IN (1,2,3,4,5)
<if test="beanConsumeLive.jwcode != null and beanConsumeLive.jwcode != ''">
AND fm.jwcode = #{beanConsumeLive.jwcode}
</if>
<if test="beanConsumeLive.dept != null and beanConsumeLive.dept != ''">
AND fm.dept = #{beanConsumeLive.dept}
</if>
<if test="beanConsumeLive.type != null and beanConsumeLive.type != ''">
AND fyr.source_type = #{beanConsumeLive.type}
</if>
<if test="beanConsumeLive.startTime != null and beanConsumeLive.endTime != null">
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeLive.startTime})
AND UNIX_TIMESTAMP(#{beanConsumeLive.endTime})
</if>
</where>
) AS t
<where>
<if test="beanConsumeLive.gift != null and beanConsumeLive.gift != ''">
AND t.gift = #{beanConsumeLive.gift}
</if>
<if test="beanConsumeLive.liveChannel != null and beanConsumeLive.liveChannel != ''">
AND t.liveChannel= #{beanConsumeLive.liveChannel}
</if>
<if test="beanConsumeLive.liveName != null and beanConsumeLive.liveName != ''">
AND t.liveName LIKE CONCAT('%', #{beanConsumeLive.liveName}, '%')
</if>
</where>
<choose>
<when test="beanConsumeLive.sortField != null and beanConsumeLive.sortField != '' and beanConsumeLive.sortOrder != null and beanConsumeLive.sortOrder != ''">
ORDER BY t.${beanConsumeLive.sortField} ${beanConsumeLive.sortOrder}
</when>
<otherwise>
ORDER BY t.consumeTime DESC
</otherwise>
</choose>
</select>
<!--查询消费直播合计数-->
<select id="selectSumLiveBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeGold">
SELECT
IFNULL(SUM(t.money_buy), 0) AS permanentBean,
IFNULL(SUM(t.money_free), 0) AS freeBean,
COUNT(*) AS totalNum
FROM (
SELECT
fyr.money_buy,
fyr.money_free,
fyr.time
FROM fx_member fm
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id
<where>
fyr.pay_type IN (1,2,3,4,5)
<if test="beanConsumeLive.jwcode != null and beanConsumeLive.jwcode != ''">
AND fm.jwcode = #{beanConsumeLive.jwcode}
</if>
<if test="beanConsumeLive.dept != null and beanConsumeLive.dept != ''">
AND fm.dept = #{beanConsumeLive.dept}
</if>
<if test="beanConsumeLive.type != null and beanConsumeLive.type != ''">
AND fyr.source_type = #{beanConsumeLive.type}
</if>
<if test="beanConsumeLive.gift != null and beanConsumeLive.gift != ''">
AND CASE
WHEN LOCATE('直播间', fyr.content) > 0 AND LOCATE('送礼物', fyr.content) > 0
THEN SUBSTRING(fyr.content, LOCATE('送礼物', fyr.content) + CHAR_LENGTH('送礼物'))
ELSE NULL
END = #{beanConsumeLive.gift}
</if>
<if test="beanConsumeLive.liveChannel != null and beanConsumeLive.liveChannel != ''">
AND CASE
WHEN LOCATE('直播间', fyr.content) > 0 AND LOCATE('送礼物', fyr.content) > 0
THEN SUBSTRING_INDEX(SUBSTRING(fyr.content, LOCATE('直播间', fyr.content) + CHAR_LENGTH('直播间')), '送礼物', 1)
ELSE NULL
END = #{beanConsumeLive.liveChannel}
</if>
<if test="beanConsumeLive.startTime != null and beanConsumeLive.endTime != null">
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeLive.startTime})
AND UNIX_TIMESTAMP(#{beanConsumeLive.endTime})
</if>
<if test="beanConsumeLive.liveName != null and beanConsumeLive.liveName != ''">
AND fyr.source_name LIKE CONCAT('%', #{beanConsumeLive.liveName}, '%')
</if>
</where>
) AS t
</select>
<!--筛选铁粉消费记录-->
<select id="selectFanBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeFan">
SELECT fm.nickname AS name,
fm.jwcode,
fm.dept,
fyr.money AS beanNum,
fyr.source_name AS channel,
fyr.source_type AS type,
FROM_UNIXTIME(fyr.time, '%Y-%m-%d %H:%i:%s') AS consumeTime,
fyr.pay_type AS payType
FROM fx_member fm
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id
<where>
fyr.pay_type = 7
<if test="beanConsumeFan.jwcode != null and beanConsumeFan.jwcode != ''">
AND fm.jwcode = #{beanConsumeFan.jwcode}
</if>
<if test="beanConsumeFan.dept != null and beanConsumeFan.dept != ''">
AND fm.dept = #{beanConsumeFan.dept}
</if>
<if test="beanConsumeFan.channel != null and beanConsumeFan.channel != ''">
AND fyr.source_name =#{beanConsumeFan.channel}
</if>
<if test="beanConsumeFan.startTime != null and beanConsumeFan.endTime != null">
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeFan.startTime})
AND UNIX_TIMESTAMP(#{beanConsumeFan.endTime})
</if>
</where>
<choose>
<when test="beanConsumeFan.sortField != null and beanConsumeFan.sortField != '' and beanConsumeFan.sortOrder != null and beanConsumeFan.sortOrder != ''">
ORDER BY ${beanConsumeFan.sortField} ${beanConsumeFan.sortOrder}
</when>
<otherwise>
ORDER BY consumeTime DESC
</otherwise>
</choose>
</select>
<!--铁粉消耗合计数-->
<select id="selectSumFansBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeGold">
SELECT
IFNULL(SUM(t.money_buy), 0) AS permanentBean,
IFNULL(SUM(t.money_free), 0) AS freeBean,
COUNT(*) AS totalNum
FROM (
SELECT
fyr.money_buy,
fyr.money_free,
fyr.time
FROM fx_member fm
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id
<where>
fyr.pay_type = 7
<if test="beanConsumeFan.jwcode != null and beanConsumeFan.jwcode != ''">
AND fm.jwcode = #{beanConsumeFan.jwcode}
</if>
<if test="beanConsumeFan.dept != null and beanConsumeFan.dept != ''">
AND fm.dept = #{beanConsumeFan.dept}
</if>
<if test="beanConsumeFan.channel != null and beanConsumeFan.channel != ''">
AND fyr.source_name = #{beanConsumeFan.channel}
</if>
<if test="beanConsumeFan.startTime != null and beanConsumeFan.endTime != null">
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeFan.startTime})
AND UNIX_TIMESTAMP(#{beanConsumeFan.endTime})
</if>
</where>
) AS t
</select>
<!--筛选文章消费记录-->
<select id="selectArticleBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeArticle">
SELECT fm.nickname AS name,
fm.jwcode,
fm.dept,
fyr.source_type AS type,
fyr.money AS beanNum,
fyr.source_id AS articleId,
fyr.source_name AS articleName,
(SELECT fm2.nickname
FROM fx_member fm2
WHERE fm2.jwcode = fyr.source_jwcode
LIMIT 1) AS author,
FROM_UNIXTIME(fyr.time, '%Y-%m-%d %H:%i:%s') AS consumeTime,
fyr.pay_type AS payType
FROM fx_member fm
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id
<where>
fyr.pay_type = 8
<if test="beanConsumeArticle.jwcode != null and beanConsumeArticle.jwcode != ''">
AND fm.jwcode = #{beanConsumeArticle.jwcode}
</if>
<if test="beanConsumeArticle.dept != null and beanConsumeArticle.dept != ''">
AND fm.dept = #{beanConsumeArticle.dept}
</if>
<if test="beanConsumeArticle.author != null and beanConsumeArticle.author != ''">
AND (SELECT fm2.nickname
FROM fx_member fm2
WHERE fm2.jwcode = fyr.source_jwcode
LIMIT 1)=#{beanConsumeArticle.author}
</if>
<if test="beanConsumeArticle.ArticleName != null and beanConsumeArticle.ArticleName != ''">
AND fyr.source_name =#{beanConsumeArticle.ArticleName}
</if>
<if test="beanConsumeArticle.articleId != null and beanConsumeArticle.articleId != ''">
AND fyr.source_id =#{beanConsumeArticle.articleId}
</if>
<if test="beanConsumeArticle.startTime != null and beanConsumeArticle.endTime != null">
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeArticle.startTime})
AND UNIX_TIMESTAMP(#{beanConsumeArticle.endTime})
</if>
</where>
<choose>
<when test="beanConsumeArticle.payMode == 0">
AND fyr.source_type IN (9, 10)
</when>
<when test="beanConsumeArticle.payMode == 1">
AND fyr.source_type = 11
</when>
<when test="beanConsumeArticle.payMode == 2">
AND fyr.source_type not in (9, 10,11)
</when>
<when test="beanConsumeArticle.sortField != null and beanConsumeArticle.sortField != '' and beanConsumeArticle.sortOrder != null and beanConsumeArticle.sortOrder != ''">
ORDER BY ${beanConsumeArticle.sortField} ${beanConsumeArticle.sortOrder}
</when>
<otherwise>
ORDER BY consumeTime DESC
</otherwise>
</choose>
</select>
<!--查询金豆文章消费-->
<select id="selectSumArticleBy" resultType="com.example.demo.domain.vo.bean.BeanConsumeGold">
SELECT
IFNULL(SUM(t.money_buy), 0) AS permanentBean,
IFNULL(SUM(t.money_free), 0) AS freeBean,
COUNT(*) AS totalNum
FROM ( SELECT
fyr.money_buy,
fyr.money_free,
fyr.time
FROM fx_member fm
INNER JOIN fx_yaoqing_records fyr ON fyr.uid = fm.id
<where>
fyr.pay_type = 8
<if test="beanConsumeArticle.jwcode != null and beanConsumeArticle.jwcode != ''">
AND fm.jwcode = #{beanConsumeArticle.jwcode}
</if>
<if test="beanConsumeArticle.dept != null and beanConsumeArticle.dept != ''">
AND fm.dept = #{beanConsumeArticle.dept}
</if>
<if test="beanConsumeArticle.ArticleName != null and beanConsumeArticle.ArticleName != ''">
AND fyr.source_name =#{beanConsumeArticle.ArticleName}
</if>
<if test="beanConsumeArticle.author != null and beanConsumeArticle.author != ''">
AND (SELECT fm2.nickname
FROM fx_member fm2
WHERE fm2.jwcode = fyr.source_jwcode
LIMIT 1)=#{beanConsumeArticle.author}
</if>
<if test="beanConsumeArticle.articleId != null and beanConsumeArticle.articleId != ''">
AND fyr.source_id =#{beanConsumeArticle.articleId}
</if>
<if test="beanConsumeArticle.startTime != null and beanConsumeArticle.endTime != null">
AND fyr.time BETWEEN UNIX_TIMESTAMP(#{beanConsumeArticle.startTime})
AND UNIX_TIMESTAMP(#{beanConsumeArticle.endTime})
</if>
</where>
<choose>
<when test="beanConsumeArticle.payMode == 0">
AND fyr.source_type IN (9, 10)
</when>
<when test="beanConsumeArticle.payMode == 1">
AND fyr.source_type = 11
</when>
<when test="beanConsumeArticle.payMode == 2">
AND fyr.source_type not in (9, 10,11)
</when>
</choose>
) as t
</select>
<!--获取直播礼物-->
<select id="getLiveGift" resultType="java.lang.String">
SELECT DISTINCT
CASE
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0
THEN SUBSTRING(content, LOCATE('送礼物', content) + CHAR_LENGTH('送礼物'))
ELSE NULL
END AS gift
FROM fx_yaoqing_records
WHERE LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0
AND content IS NOT NULL AND source_type=1
</select>
<select id="getLiveChannel" resultType="java.lang.String">
SELECT DISTINCT
CASE
WHEN LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0
THEN SUBSTRING_INDEX(SUBSTRING(content, LOCATE('直播间', content) + CHAR_LENGTH('直播间')), '送礼物', 1)
ELSE NULL
END AS liveChannel
FROM fx_yaoqing_records
WHERE LOCATE('直播间', content) > 0 AND LOCATE('送礼物', content) > 0
AND content IS NOT NULL AND pay_type in (1,2,3,4,5)
</select>
</mapper>

6
src/main/resources/jindouMapper/BeanRechargeMapper.xml

@ -1,6 +0,0 @@
<?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.coin.RechargeMapper">
</mapper>

64
src/main/resources/jindouMapper/BeanRechargeMapper2.xml

@ -0,0 +1,64 @@
<?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.bean.BeanRechargeMapper2">
<select id="selectBySystem" resultType="com.example.demo.domain.vo.bean.BeanRechargeInfo">
SELECT f.id AS id,
m.jwcode AS jwcode,
m.nickname AS name,
m.dept AS market,
f.money_free AS freeBean,
f.money_buy AS permanentBean,
f.money AS money,
f.content AS remark,
FROM_UNIXTIME(f.time) AS rechargeTime
FROM fx_yaoqing_records f
LEFT JOIN fx_member m ON f.uid = m.id
<where>
f.data = 0
<if test="jwcode != null and jwcode != ''">
AND m.jwcode = #{jwcode}
</if>
<if test="market != null and market != ''">
AND m.dept = #{market}
</if>
<if test="startTime != null and endTime != null">
AND FROM_UNIXTIME(f.time) BETWEEN #{startTime} AND #{endTime}
</if>
</where>
<trim prefix="ORDER BY" suffixOverrides=",">
<choose>
<!-- 当指定排序字段时使用指定字段排序 -->
<when test="sortField != null and sortField != ''">
<choose>
<!-- 对金币数量的排序处理 -->
<when test="sortField == 'permanentBean'">f.money_buy</when>
<when test="sortField == 'freeBean'">f.money_free</when>
<!-- 对时间字段的排序处理 -->
<when test="sortField == 'rechargeTime'">f.time</when>
<!-- 其他字段不支持排序,使用默认排序 -->
<otherwise>f.time</otherwise>
</choose>
<!-- 排序方向处理 -->
<if test="sortOrder != null and sortOrder != ''">
<choose>
<when test="sortOrder == 'ASC'">ASC</when>
<when test="sortOrder == 'DESC'">DESC</when>
<otherwise>DESC</otherwise>
</choose>
</if>
<if test="sortOrder == null or sortOrder == ''">
DESC
</if>
</when>
<!-- 未指定排序字段时,使用默认的时间降序排序 -->
<otherwise>
f.time DESC
</otherwise>
</choose>
</trim>
</select>
<select id="systemMarket" resultType="java.lang.String">
select DISTINCT dept from fx_member
</select>
</mapper>

74
src/main/resources/jindouMapper/BeanUser.xml

@ -8,16 +8,84 @@
SELECT
m.nickname AS name,
m.jwcode AS jwcode,
m.loc_market AS market,
m.dept AS market,
y.jinbi_free AS freeBean,
y.jinbi_buy AS permanentBean
y.jinbi_buy AS permanentBean,
y.jinbi_cost_total AS consumeSum
FROM
fx_member m
INNER JOIN
LEFT JOIN
fx_yaoqing y ON m.id = y.uid
<where>
m.jwcode = #{jwcode}
</where>
</select>
<!--查询客户金豆余额-->
<select id="selectUserBy" resultType="com.example.demo.domain.vo.bean.BeanUser">
SELECT fm.nickname AS name,
fm.jwcode,
fm.dept,
fy.jinbi AS beanNum,
fy.jinbi_free AS freeBean,
fy.jinbi_buy AS buyBean,
fy.jinbi_cost_total AS totalCostBean
FROM fx_member fm
INNER JOIN fx_yaoqing fy ON fy.uid = fm.id
<where>
<if test="beanUser.jwcode != null and beanUser.jwcode != ''">
AND fm.jwcode = #{beanUser.jwcode}
</if>
<if test="beanUser.dept != null and beanUser.dept != ''">
AND fm.dept = #{beanUser.dept}
</if>
</where>
<choose>
<when test="beanUser.sortField != null and beanUser.sortField != '' and beanUser.sortOrder != null and beanUser.sortOrder != ''">
ORDER BY ${beanUser.sortField} ${beanUser.sortOrder}
</when>
<otherwise>
ORDER BY beanNum DESC
</otherwise>
</choose>
</select>
<!--查询客户金豆余额合计数-->
<select id="SumUserBy" resultType="com.example.demo.domain.vo.bean.BeanUserCard">
SELECT
IFNULL(SUM(t.jinbi), 0) AS sumBean,
IFNULL(SUM(t.jinbi_buy), 0) AS permanentBean,
IFNULL(SUM(t.jinbi_free), 0) AS freeBean,
IFNULL(SUM(t.jinbi_cost_total),0) AS consumeSum
FROM (
SELECT
fy.jinbi,
fy.jinbi_buy,
fy.jinbi_free,
fy.jinbi_cost_total
FROM fx_member fm
INNER JOIN fx_yaoqing fy ON fy.uid = fm.id
<where>
<if test="beanUser.jwcode != null and beanUser.jwcode != ''">
AND fm.jwcode = #{beanUser.jwcode}
</if>
<if test="beanUser.dept != null and beanUser.dept != ''">
AND fm.dept = #{beanUser.dept}
</if>
</where>
) AS t
</select>
<select id="getDept" resultType="java.lang.String">
select distinct fm.dept
from fx_member fm
inner join fx_yaoqing fy on fy.uid = fm.id
where fm.dept is not null and fm.dept != ''
</select>
</mapper>

4
src/main/resources/mapper/AuditMapper.xml

@ -61,7 +61,7 @@
<if test="rechargeAudit.activity != null and rechargeAudit.activity != ''">
AND ugr.activity = #{rechargeAudit.activity}
</if>
<if test="rechargeAudit.markets != null and rechargeAudit.markets.size() > 0 and '总部' not in rechargeAudit.markets">
<if test="rechargeAudit.markets != null and rechargeAudit.markets.size() > 0 and '1' not in rechargeAudit.markets">
AND (
<foreach collection="rechargeAudit.markets" item="market" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
@ -122,7 +122,7 @@
<if test="refundAudit.market != null and refundAudit.market != ''">
AND u.market = #{refundAudit.market}
</if>
<if test="refundAudit.markets != null and refundAudit.markets.size() > 0 and '总部' not in refundAudit.markets">
<if test="refundAudit.markets != null and refundAudit.markets.size() > 0 and '1' not in refundAudit.markets">
AND (
<foreach collection="refundAudit.markets" item="market" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')

28
src/main/resources/mapper/BeanRechargeMapper1.xml

@ -0,0 +1,28 @@
<?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.coin.BeanRechargeMapper1">
<insert id="add" parameterType="com.example.demo.domain.vo.bean.BeanRecharge" useGeneratedKeys="true" keyProperty="id">
INSERT INTO audit
<trim prefix="(" suffix=")" suffixOverrides=",">
jwcode,
buy_jd,
free_jd,
type,
admin_name,
remark,
audit_status
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
#{jwcode},
#{permanentBean},
#{freeBean},
0,
#{adminName},
#{remark},
0
</trim>
</insert>
</mapper>

11
src/main/resources/mapper/ConsumeMapper.xml

@ -24,7 +24,7 @@
<where>
ugr.type = 1 AND ugr.flag = 1
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
<if test="markets != null and markets.size() > 0 and '1' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
@ -92,12 +92,11 @@
admin a ON ugr.admin_id = a.id
<where>
ugr.type = 1 AND ugr.flag = 1
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
<if test="markets != null and markets.size > 0 and !(markets.size() == 1 and markets[0] == '')">
AND u.market IN
<foreach collection="markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
)
</if>
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}

2
src/main/resources/mapper/PermissionMapper.xml

@ -84,7 +84,7 @@
<if test="postiton!=null and postiton.length>0">
and admin.postiton=#{postiton}
</if>
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
<if test="markets != null and markets.size() > 0 and '1' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
admin.market LIKE CONCAT('%', #{market}, '%')

20
src/main/resources/mapper/RechargeMapper.xml

@ -27,13 +27,12 @@
<where>
ugr.type = 0 AND ugr.audit_status IN (1,3)
AND ugr.flag = 1
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
<if test="markets!= null and markets.size > 0">
AND user.market IN
<foreach collection="markets" item="markets" open="(" separator="," close=")">
#{markets}
</foreach>
)
</if>
</where>
<trim prefix="ORDER BY" suffixOverrides=",">
@ -97,12 +96,11 @@
ugr.type = 0 AND ugr.audit_status IN (1,3)
AND ugr.flag = 1
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
<if test="markets != null and markets.size > 0 and !(markets.size() == 1 and markets[0] == '')">
AND u.market IN
<foreach collection="markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
)
</if>
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}

11
src/main/resources/mapper/RefundMapper.xml

@ -26,7 +26,7 @@
<where>
ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
<if test="markets != null and markets.size() > 0 and '1' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
@ -95,12 +95,11 @@
admin a ON ugr.admin_id = a.id
<where>
ugr.type = 2 AND ugr.audit_status IN (1,3) AND ugr.flag = 1
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
u.market LIKE CONCAT('%', #{market}, '%')
<if test="markets != null and markets.size > 0 and !(markets.size() == 1 and markets[0] == '')">
AND u.market IN
<foreach collection="markets" item="market" open="(" separator="," close=")">
#{market}
</foreach>
)
</if>
<if test="jwcode != null and jwcode != ''">
AND ugr.jwcode = #{jwcode}

4
src/main/resources/mapper/RoleMapper.xml

@ -37,7 +37,7 @@
SELECT id,role_name FROM role
<where>
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
<if test="markets != null and markets.size() > 0 and '1' not in markets">
AND market IN
<foreach collection="markets" item="market" open="(" close=")" separator=",">
#{market}
@ -91,7 +91,7 @@
r.market LIKE CONCAT('%', #{market}, '%')
</if>
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
<if test="markets != null and markets.size() > 0 and '1' not in markets">
AND r.market IN
<foreach collection="markets" item="market" open="(" close=")" separator=",">
#{market}

8
src/main/resources/mapper/UrlMapper.xml

@ -1,8 +0,0 @@
<?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.UrlMapper">
<select id="selectBaseUrl" resultType="java.lang.String">
select value from env where `key` = #{key}
</select>
</mapper>

2
src/main/resources/mapper/UserMapper.xml

@ -57,7 +57,7 @@
<where>
jwcode = #{jwcode}
<!-- 判断 market 是否不为总部且 markets 不为空 -->
<if test="markets != null and markets.size() > 0 and '总部' not in markets">
<if test="markets != null and markets.size() > 0 and '1' not in markets">
AND (
<foreach collection="markets" item="market" open="" close="" separator=" OR ">
market LIKE CONCAT('%', #{market}, '%')

70
src/main/resources/paymapper/BeanRechargeMapper3.xml

@ -0,0 +1,70 @@
<?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.pay.BeanRechargeMapper3">
<select id="selectByOnline" resultType="com.example.demo.domain.vo.bean.BeanRechargeInfo">
SELECT g.id AS id,
g.jwcode AS jwcode,
m.name AS name,
m.deptName AS market,
g.order_no AS orderNo,
g.count AS num,
g.price AS money,
g.platform AS platform,
FROM_UNIXTIME(g.add_time) AS rechargeTime
FROM g_order g
LEFT JOIN member_info m ON g.jwcode = m.jwcode
<where>
g.type = "gold" AND g.state = 1
<if test="jwcode != null and jwcode != ''">
AND g.jwcode = #{jwcode}
</if>
<if test="market != null and market != ''">
AND m.deptName = #{market}
</if>
<if test="orderNo != null and orderNo != ''">
AND g.order_no = #{orderNo}
</if>
<if test="platform != null and platform != ''">
AND g.platform = #{platform}
</if>
<if test="startTime != null and endTime != null">
AND FROM_UNIXTIME(g.add_time) BETWEEN #{startTime} AND #{endTime}
</if>
</where>
<trim prefix="ORDER BY" suffixOverrides=",">
<choose>
<!-- 当指定排序字段时使用指定字段排序 -->
<when test="sortField != null and sortField != ''">
<choose>
<!-- 对金币数量的排序处理 -->
<when test="sortField == 'num'">g.count</when>
<when test="sortField == 'money'">g.price</when>
<!-- 对时间字段的排序处理 -->
<when test="sortField == 'rechargeTime'">g.add_time</when>
<!-- 其他字段不支持排序,使用默认排序 -->
<otherwise>g.add_time</otherwise>
</choose>
<!-- 排序方向处理 -->
<if test="sortOrder != null and sortOrder != ''">
<choose>
<when test="sortOrder == 'ASC'">ASC</when>
<when test="sortOrder == 'DESC'">DESC</when>
<otherwise>DESC</otherwise>
</choose>
</if>
<if test="sortOrder == null or sortOrder == ''">
DESC
</if>
</when>
<!-- 未指定排序字段时,使用默认的时间降序排序 -->
<otherwise>
g.add_time DESC
</otherwise>
</choose>
</trim>
</select>
<select id="onlineMarket" resultType="java.lang.String">
select DISTINCT deptName from member_info
</select>
</mapper>
Loading…
Cancel
Save