Browse Source

7.30地区部分修改以及导出的封装

huangqizheng/feature-20250731164458-地区部分修改以及导出的封装
huangqizhen 2 weeks ago
parent
commit
c2f590d6c4
  1. 1
      src/main/java/com/example/demo/DemoApplication.java
  2. 272
      src/main/java/com/example/demo/Export/ExportServiceImpl.java
  3. 5
      src/main/java/com/example/demo/config/Mysql2DataSourceConfig.java
  4. 57
      src/main/java/com/example/demo/controller/coin/ConsumeController.java
  5. 8
      src/main/java/com/example/demo/controller/coin/GoldDetailController.java
  6. 51
      src/main/java/com/example/demo/controller/coin/RechargeController.java
  7. 52
      src/main/java/com/example/demo/controller/coin/RefundController.java
  8. 2
      src/main/java/com/example/demo/controller/coin/WorkbenchController.java
  9. 2
      src/main/java/com/example/demo/domain/vo/coin/ConsumeUser.java
  10. 2
      src/main/java/com/example/demo/domain/vo/coin/GoldDetail.java
  11. 42
      src/main/java/com/example/demo/domain/vo/coin/RechargeUser.java
  12. 2
      src/main/java/com/example/demo/domain/vo/coin/RefundUser.java
  13. 7
      src/main/java/com/example/demo/service/coin/ExportExcelService.java
  14. 66
      src/main/java/com/example/demo/service/listen/BaseMessageListener.java
  15. 1211
      src/main/java/com/example/demo/serviceImpl/coin/ExportExcelServiceImpl.java
  16. 10
      src/main/java/com/example/demo/serviceImpl/coin/GeneralServiceImpl.java
  17. 2
      src/main/java/com/example/demo/serviceImpl/coin/MarketServiceImpl.java
  18. 4
      src/main/java/com/example/demo/serviceImpl/coin/PermissionServiceImpl.java
  19. 6
      src/main/java/com/example/demo/serviceImpl/coin/WorkbenchServiceImpl.java
  20. 4
      src/main/resources/mapper/AuditMapper.xml
  21. 11
      src/main/resources/mapper/ConsumeMapper.xml
  22. 2
      src/main/resources/mapper/PermissionMapper.xml
  23. 20
      src/main/resources/mapper/RechargeMapper.xml
  24. 11
      src/main/resources/mapper/RefundMapper.xml
  25. 4
      src/main/resources/mapper/RoleMapper.xml
  26. 2
      src/main/resources/mapper/UserMapper.xml

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

@ -8,6 +8,7 @@ import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling // 启用调度功能
@MapperScan(basePackages = "com.example.demo.mapper", sqlSessionTemplateRef = "mysql1SqlSessionTemplate")
@MapperScan(basePackages = "com.example.demo.mapper.bean", sqlSessionTemplateRef = "mysql2SqlSessionTemplate")
public class DemoApplication {
public static void main(String[] args) {

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

@ -32,7 +32,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 +40,150 @@ 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")
* @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();
try{
// 调用方式
// 设置 DTO 的通用字段
setCommonFields(dto, account, adminName);
// 插入导出记录并获取主键
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);
}
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()
);
// 获取主键
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());
}
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");
}
}

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")

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("请检查筛选数据的格式");
}
}
}

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);//不走缓存计算卡片属性

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

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; // 地区列表
}

7
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
@ -19,4 +23,7 @@ public interface ExportExcelService {
Exception consumeExcel(String message) throws Exception;
Exception refundExcel(String message) throws Exception;
List<Export> getExcel(Export export);
@Transactional
Exception exportExcelGeneric(String message, String exportType, Function<Page, Result> dataFetcher) throws Exception;
}

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

@ -0,0 +1,66 @@
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());
}
}
}

1211
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;

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}, '%')

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}

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}, '%')

Loading…
Cancel
Save