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.

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