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.

287 lines
12 KiB

3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. package com.example.demo.controller.coin;
  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.config.interfac.Log;
  6. import com.example.demo.domain.DTO.GoldDetailDTO;
  7. import com.example.demo.domain.DTO.GoldUserDTO;
  8. import com.example.demo.domain.entity.Admin;
  9. import com.example.demo.domain.entity.User;
  10. import com.example.demo.domain.vo.coin.GoldDetail;
  11. import com.example.demo.domain.vo.coin.Page;
  12. import com.example.demo.domain.vo.coin.Result;
  13. import com.example.demo.service.coin.GoldDetailService;
  14. import com.example.demo.service.coin.MarketService;
  15. import com.example.demo.serviceImpl.coin.AiEmotionServiceImpl;
  16. import jakarta.servlet.http.HttpServletRequest;
  17. import jakarta.validation.Valid;
  18. import lombok.RequiredArgsConstructor;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.util.ObjectUtils;
  23. import org.springframework.web.bind.annotation.*;
  24. import org.springframework.web.context.request.RequestContextHolder;
  25. import org.springframework.web.context.request.ServletRequestAttributes;
  26. import java.util.Arrays;
  27. import java.util.List;
  28. import java.util.UUID;
  29. /**
  30. * @program: GOLD
  31. * @ClassName GoldDetailController
  32. * @description:
  33. * @author: huangqizhen
  34. * @create: 202506-23 14:41
  35. * @Version 1.0
  36. **/
  37. @RestController
  38. @RequestMapping("/goldDetail")
  39. @RequiredArgsConstructor
  40. @Slf4j
  41. @CrossOrigin
  42. public class GoldDetailController {
  43. @Autowired
  44. private GoldDetailService goldDetailService;
  45. @Autowired
  46. private RedisLockUtil redisLockUtil;
  47. @Autowired
  48. private AiEmotionServiceImpl aiEmotionServiceImpl;
  49. @Autowired
  50. MarketService marketService;
  51. @Log("获取金币明细")
  52. @PostMapping("/getGoldDetail")
  53. public Result getGoldDetail(@RequestBody Page page) throws Exception {
  54. // 获取当前请求对象
  55. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  56. String token = request.getHeader("token");
  57. // 解析 token 获取用户信息
  58. Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  59. List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
  60. List<String> markets = marketService.getMarketIds(userMarkets);
  61. // 校验分页参数
  62. if (ObjectUtils.isEmpty(page.getPageNum())) {
  63. return Result.error("页码数为空!");
  64. }
  65. if (ObjectUtils.isEmpty(page.getPageSize())) {
  66. return Result.error("页大小为空!");
  67. }
  68. // 获取传入的市场列表
  69. List<String> requestedMarkets = page.getGoldDetail() != null ? page.getGoldDetail().getMarkets() : null;
  70. // 权限校验逻辑
  71. if (markets.contains("9") || markets.contains("9999")) {
  72. // 特权市场:9 或 9999,跳过权限校验,直接放行传入的 markets
  73. // 如果业务需要,也可以在这里做空值处理
  74. if (page.getGoldDetail() != null) {
  75. // 保持 requestedMarkets 不变,原样接受
  76. // 可选:如果 requestedMarkets 为 null,可设为默认值或保持 null
  77. }
  78. } else {
  79. // 普通用户:必须校验权限
  80. if (requestedMarkets == null || requestedMarkets.isEmpty()) {
  81. page.getGoldDetail().setMarkets(requestedMarkets);
  82. }
  83. if (!markets.containsAll(requestedMarkets)) {
  84. return Result.error("无权限!请求的市场不在授权范围内。");
  85. }
  86. // 校验通过,保持 requestedMarkets 不变
  87. }
  88. // 返回详情数据
  89. return Result.success(goldDetailService.getGoldDetail(
  90. page.getPageNum(),
  91. page.getPageSize(),
  92. page.getGoldDetail()
  93. ));
  94. }
  95. @Log("客户金币明细金币合计数统计")
  96. @PostMapping("/getTotal")
  97. public Result getTotal(@RequestBody Page page) throws Exception {
  98. Integer pageNum = page.getPageNum();
  99. Integer pageSize = page.getPageSize();
  100. GoldDetail goldDetail = page.getGoldDetail();
  101. // 获取当前请求对象
  102. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  103. String token = request.getHeader("token");
  104. // 解析 token 获取用户信息
  105. Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  106. List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
  107. List<String> markets = marketService.getMarketIds(userMarkets);
  108. // 获取传入的市场列表
  109. List<String> requestedMarkets = page.getGoldDetail() != null ? page.getGoldDetail().getMarkets() : null;
  110. // 权限校验逻辑
  111. if (markets.contains("9") || markets.contains("9999")) {
  112. // 特权市场:9 或 9999,跳过权限校验,直接放行传入的 markets
  113. // 如果业务需要,也可以在这里做空值处理
  114. if (page.getGoldDetail() != null) {
  115. // 保持 requestedMarkets 不变,原样接受
  116. // 可选:如果 requestedMarkets 为 null,可设为默认值或保持 null
  117. }
  118. } else {
  119. // 普通用户:必须校验权限
  120. if (requestedMarkets == null || requestedMarkets.isEmpty()) {
  121. page.getGoldDetail().setMarkets(requestedMarkets);
  122. }
  123. if (!markets.containsAll(requestedMarkets)) {
  124. return Result.error("无权限!请求的市场不在授权范围内。");
  125. }
  126. // 校验通过,保持 requestedMarkets 不变
  127. }
  128. return Result.success(goldDetailService.sumGold(pageNum,pageSize,goldDetail));
  129. }
  130. @Log("客户金币余额金币合计数统计")
  131. @PostMapping("/goldTotal")
  132. public Result GoldTotal(@RequestBody User user) throws Exception {
  133. // 获取当前请求对象
  134. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  135. String token = request.getHeader("token");
  136. // 解析 token 获取用户信息
  137. Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  138. List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
  139. List<String> markets = marketService.getMarketIds(userMarkets);
  140. // 获取传入的市场列表
  141. List<String> requestedMarkets = user != null ? user.getMarkets() : null;
  142. // 权限校验逻辑
  143. if (markets.contains("9") || markets.contains("9999")) {
  144. // 特权市场:9 或 9999,跳过权限校验,直接放行传入的 markets
  145. // 如果业务需要,也可以在这里做空值处理
  146. if (user != null) {
  147. // 保持 requestedMarkets 不变,原样接受
  148. // 可选:如果 requestedMarkets 为 null,可设为默认值或保持 null
  149. }
  150. } else {
  151. // 普通用户:必须校验权限
  152. if (requestedMarkets == null || requestedMarkets.isEmpty()) {
  153. user.setMarkets(null);
  154. }
  155. if (!markets.containsAll(requestedMarkets)) {
  156. return Result.error("无权限!请求的市场不在授权范围内。");
  157. }
  158. // 校验通过,保持 requestedMarkets 不变
  159. }
  160. return Result.success(goldDetailService.GoldTotal(user));
  161. }
  162. @Log("获取客户金币余额记录")
  163. @PostMapping("/getGold")
  164. public Result getGold(@RequestBody Page page) throws Exception {
  165. // 获取当前请求对象
  166. HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  167. String token = request.getHeader("token");
  168. // 解析 token 获取用户信息
  169. Admin admin = (Admin) JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  170. List<String> userMarkets = Arrays.asList(StringUtils.split(admin.getMarkets(), ","));
  171. List<String> markets = marketService.getMarketIds(userMarkets);
  172. // 校验分页参数
  173. if (ObjectUtils.isEmpty(page.getPageNum())) {
  174. return Result.error("页码数为空!");
  175. }
  176. if (ObjectUtils.isEmpty(page.getPageSize())) {
  177. return Result.error("页大小为空!");
  178. }
  179. // 获取传入的市场列表
  180. List<String> requestedMarkets = page.getUser() != null ? page.getUser().getMarkets() : null;
  181. // 权限校验逻辑
  182. if (markets.contains("9") || markets.contains("9999")) {
  183. // 特权市场:9 或 9999,跳过权限校验,直接放行传入的 markets
  184. // 如果业务需要,也可以在这里做空值处理
  185. if (page.getUser() != null) {
  186. // 保持 requestedMarkets 不变,原样接受
  187. // 可选:如果 requestedMarkets 为 null,可设为默认值或保持 null
  188. }
  189. } else {
  190. // 普通用户:必须校验权限
  191. if (requestedMarkets == null || requestedMarkets.isEmpty()) {
  192. page.getUser().setMarkets(null);
  193. }
  194. if (!markets.containsAll(requestedMarkets)) {
  195. return Result.error("无权限!请求的市场不在授权范围内。");
  196. }
  197. // 校验通过,保持 requestedMarkets 不变
  198. }
  199. return Result.success(goldDetailService.getGold(page.getPageNum(), page.getPageSize(), page.getUser()));
  200. }
  201. @PostMapping("/export")
  202. public Result export(@Valid @RequestBody GoldDetailDTO dto) {
  203. String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
  204. String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
  205. long expireTime = 5000; // 锁过期时间(5秒)s
  206. try {
  207. // 尝试获取锁
  208. if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
  209. throw new BusinessException("操作太频繁,请稍后重试");
  210. }
  211. // 执行业务逻辑
  212. return goldDetailService.addExportRecord(dto);
  213. } finally {
  214. // 释放锁
  215. redisLockUtil.unlock(lockKey, requestId);
  216. }
  217. }
  218. @PostMapping("/exportGold")
  219. public Result export(@Valid @RequestBody GoldUserDTO dto) {
  220. String lockKey = "export:lock:" + dto.getToken(); // 锁的 Key(可按用户/业务区分)
  221. String requestId = UUID.randomUUID().toString(); // 请求 ID(防止误删锁)
  222. long expireTime = 5000; // 锁过期时间(5秒)s
  223. try {
  224. // 尝试获取锁
  225. if (!redisLockUtil.tryLock(lockKey, requestId, expireTime)) {
  226. throw new BusinessException("操作太频繁,请稍后重试");
  227. }
  228. // 执行业务逻辑
  229. return goldDetailService.addExportRecordGold(dto);
  230. } finally {
  231. // 释放锁
  232. redisLockUtil.unlock(lockKey, requestId);
  233. }
  234. }
  235. @PostMapping("/exportqqq")
  236. public Result ExcelGoldDetail(@RequestBody Page page) throws Exception {
  237. if(ObjectUtils.isEmpty(page.getPageNum())){
  238. return Result.error("页码数为空!");
  239. }
  240. if(ObjectUtils.isEmpty(page.getPageSize())){
  241. return Result.error("页大小为空!");
  242. }
  243. else{
  244. return Result.success(goldDetailService.getGoldDetail(page.getPageNum(), page.getPageSize(), page.getGoldDetail()));
  245. }
  246. }
  247. public Result ExcelGold(@RequestBody Page page) throws Exception {
  248. // System.out.println( page);
  249. if(ObjectUtils.isEmpty(page.getPageNum())){
  250. return Result.error("页码数为空!");
  251. }
  252. if(ObjectUtils.isEmpty(page.getPageSize())){
  253. return Result.error("页大小为空!");
  254. }
  255. return Result.success(goldDetailService.getGold(page.getPageNum(), page.getPageSize(), page.getUser()));
  256. }
  257. }