You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
4.0 KiB

package com.example.demo.controller;
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.RechargeDTO;
import com.example.demo.domain.DTO.RefundDTO;
import com.example.demo.domain.entity.Admin;
import com.example.demo.domain.entity.Export;
import com.example.demo.domain.vo.Result;
import com.example.demo.service.ExportExcelService;
import com.example.demo.service.GoldDetailService;
import com.example.demo.Export.ExportService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.UUID;
/**
* @program: GOLD
* @ClassName ExportController
* @description:
* @author: huangqizhen
* @create: 2025−06-28 15:22
* @Version 1.0
**/
@RestController
@RequestMapping("/export")
@RequiredArgsConstructor
@Slf4j
@CrossOrigin
public class ExportController {
@Autowired
private ExportExcelService exportExcelService;
@Autowired
private RedisLockUtil redisLockUtil;
@Autowired
private GoldDetailService goldDetailService;
@Autowired
private ExportService exportService;
@PostMapping("/export")
public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception {
try {
UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
export.setAccount(Integer.valueOf(token1.getUsername()));
return Result.success(exportExcelService.getExcel(export));
} catch (Exception e) {
log.error("导出失败", e.getMessage());
return Result.error("导出失败" + e.getMessage());
}
}
@PostMapping("/exportRecharge")
public Result export(@Valid @RequestBody RechargeDTO dto) {
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
long expireTime = 5000; // 锁过期时间(5秒)s
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportRecharge(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
@PostMapping("/exportRefund")
public Result export(@Valid @RequestBody RefundDTO dto) {
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
long expireTime = 5000; // 锁过期时间(5秒)s
try {
// 尝试获取锁
if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
throw new BusinessException("操作太频繁,请稍后重试");
}
// 执行业务逻辑
return exportService.addExportRefund(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
@PostMapping("/exportConsume")
public Result export(@Valid @RequestBody ConsumeDTO dto) {
String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
long expireTime = 5000; // 锁过期时间(5秒)s
try {
return exportService.addExportConsume(dto);
} finally {
// 释放锁
redisLockUtil.unlock(lockKey, requestId);
}
}
}