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.

103 lines
4.0 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. package com.example.demo.controller;
  2. import com.example.demo.Util.BusinessException;
  3. import com.example.demo.Util.JWTUtil;
  4. import com.example.demo.Util.RedisLockUtil;
  5. import com.example.demo.domain.DTO.ConsumeDTO;
  6. import com.example.demo.domain.DTO.RechargeDTO;
  7. import com.example.demo.domain.DTO.RefundDTO;
  8. import com.example.demo.domain.entity.Admin;
  9. import com.example.demo.domain.entity.Export;
  10. import com.example.demo.domain.vo.Result;
  11. import com.example.demo.service.ExportExcelService;
  12. import com.example.demo.service.GoldDetailService;
  13. import com.example.demo.Export.ExportService;
  14. import jakarta.validation.Valid;
  15. import lombok.RequiredArgsConstructor;
  16. import lombok.extern.slf4j.Slf4j;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.security.core.userdetails.UserDetails;
  19. import org.springframework.web.bind.annotation.*;
  20. import java.util.List;
  21. import java.util.UUID;
  22. /**
  23. * @program: GOLD
  24. * @ClassName ExportController
  25. * @description:
  26. * @author: huangqizhen
  27. * @create: 202506-28 15:22
  28. * @Version 1.0
  29. **/
  30. @RestController
  31. @RequestMapping("/export")
  32. @RequiredArgsConstructor
  33. @Slf4j
  34. @CrossOrigin
  35. public class ExportController {
  36. @Autowired
  37. private ExportExcelService exportExcelService;
  38. @Autowired
  39. private RedisLockUtil redisLockUtil;
  40. @Autowired
  41. private GoldDetailService goldDetailService;
  42. @Autowired
  43. private ExportService exportService;
  44. @PostMapping("/export")
  45. public Result export(@Valid @RequestBody Export export, @RequestHeader("token") String token) throws Exception {
  46. try {
  47. UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  48. export.setAccount(Integer.valueOf(token1.getUsername()));
  49. return Result.success(exportExcelService.getExcel(export));
  50. } catch (Exception e) {
  51. log.error("导出失败", e.getMessage());
  52. return Result.error("导出失败" + e.getMessage());
  53. }
  54. }
  55. @PostMapping("/exportRecharge")
  56. public Result export(@Valid @RequestBody RechargeDTO dto) {
  57. String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
  58. String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
  59. long expireTime = 5000; // 锁过期时间(5秒)s
  60. try {
  61. // 尝试获取锁
  62. if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
  63. throw new BusinessException("操作太频繁,请稍后重试");
  64. }
  65. // 执行业务逻辑
  66. return exportService.addExportRecharge(dto);
  67. } finally {
  68. // 释放锁
  69. redisLockUtil.unlock(lockKey, requestId);
  70. }
  71. }
  72. @PostMapping("/exportRefund")
  73. public Result export(@Valid @RequestBody RefundDTO dto) {
  74. String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
  75. String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
  76. long expireTime = 5000; // 锁过期时间(5秒)s
  77. try {
  78. // 尝试获取锁
  79. if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
  80. throw new BusinessException("操作太频繁,请稍后重试");
  81. }
  82. // 执行业务逻辑
  83. return exportService.addExportRefund(dto);
  84. } finally {
  85. // 释放锁
  86. redisLockUtil.unlock(lockKey, requestId);
  87. }
  88. }
  89. @PostMapping("/exportConsume")
  90. public Result export(@Valid @RequestBody ConsumeDTO dto) {
  91. String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
  92. String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
  93. long expireTime = 5000; // 锁过期时间(5秒)s
  94. try {
  95. return exportService.addExportConsume(dto);
  96. } finally {
  97. // 释放锁
  98. redisLockUtil.unlock(lockKey, requestId);
  99. }
  100. }
  101. }