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.

234 lines
8.7 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
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.serviceImpl;
  2. import com.example.demo.Util.JWTUtil;
  3. import com.example.demo.Util.RedisUtil;
  4. import com.example.demo.domain.DTO.GoldDetailDTO;
  5. import com.example.demo.domain.DTO.GoldUserDTO;
  6. import com.example.demo.domain.entity.Admin;
  7. import com.example.demo.domain.entity.User;
  8. import com.example.demo.domain.vo.*;
  9. import com.example.demo.exception.SystemException;
  10. import com.example.demo.mapper.GoldDetailMapper;
  11. import com.example.demo.service.AdminService;
  12. import com.example.demo.service.GoldDetailService;
  13. import com.fasterxml.jackson.databind.ObjectMapper;
  14. import com.github.pagehelper.PageHelper;
  15. import com.github.pagehelper.PageInfo;
  16. import jakarta.servlet.http.HttpServletRequest;
  17. import org.springframework.beans.factory.annotation.Autowired;
  18. import org.springframework.security.core.userdetails.UserDetails;
  19. import org.springframework.stereotype.Service;
  20. import org.springframework.web.context.request.RequestContextHolder;
  21. import org.springframework.web.context.request.ServletRequestAttributes;
  22. import java.io.IOException;
  23. import java.time.LocalDateTime;
  24. import java.time.format.DateTimeFormatter;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. /**
  29. * @program: GOLD
  30. * @ClassName GoldDetailServiceImpl
  31. * @description:
  32. * @author: huangqizhen
  33. * @create: 202506-23 13:44
  34. * @Version 1.0
  35. **/
  36. @Service
  37. public class GoldDetailServiceImpl implements GoldDetailService {
  38. @Autowired
  39. private GoldDetailMapper goldDetailMapper;
  40. @Autowired
  41. private RedisUtil redisUtil;
  42. @Autowired
  43. private AdminService adminService;
  44. @Override
  45. public PageInfo<GoldDetail> getGoldDetail(Integer pageNum, Integer pageSize, GoldDetail goldDetail) {
  46. PageHelper.startPage(pageNum, pageSize);
  47. // System.out.println(goldDetail.getMarkets());
  48. List<GoldDetail> list = goldDetailMapper.getGoldDetail(goldDetail);
  49. return new PageInfo<>(list);
  50. }
  51. @Override
  52. public Total getTotal(GoldDetail goldDetail) {
  53. return goldDetailMapper.getTotal(goldDetail);
  54. }
  55. @Override
  56. public PageInfo<User> getGold(Integer pageNum, Integer pageSize, User user) {
  57. PageHelper.startPage(pageNum, pageSize);
  58. List<User> list = goldDetailMapper.getGold(user);
  59. return new PageInfo<>(list);
  60. }
  61. @Override
  62. public Total GoldTotal(User user) {
  63. return goldDetailMapper.GoldTotal(user);
  64. }
  65. /*
  66. 用户金币合计数
  67. */
  68. @Override
  69. public Gold sumGold(Integer pageNum, Integer pageSize, GoldDetail goldDetail) {
  70. Gold gold = new Gold();
  71. //获取订单列表
  72. PageHelper.startPage(1, 500000);
  73. List<GoldDetail> goldDetails = goldDetailMapper.getGoldDetail(goldDetail);
  74. // List<GoldDetail> goldDetails=goldDetailMapper.getGoldDetail1(1,500000,goldDetail);
  75. // 初始化累加器
  76. int totalNum=0;
  77. int permanentGoldSum = 0;
  78. int freeGoldSum = 0;
  79. int taskGoldSum = 0;
  80. // 遍历消费记录并累加金币
  81. for (GoldDetail detail : goldDetails) {
  82. // 累加永久金币
  83. if (detail.getPermanentGold() != null) {
  84. permanentGoldSum += detail.getPermanentGold();
  85. }
  86. // 累加免费金币
  87. if (detail.getFreeJune() != null||detail.getFreeDecember() != null) {
  88. freeGoldSum = freeGoldSum+detail.getFreeJune()+detail.getFreeDecember();
  89. }
  90. // 累加任务金币
  91. if (detail.getTaskGold() != null) {
  92. taskGoldSum += detail.getTaskGold();
  93. }
  94. // 每遍历一条记录,总条数加1
  95. totalNum++;
  96. }
  97. // 将累加结果设置到Gold对象
  98. gold.setPermanentGolds(permanentGoldSum);
  99. gold.setFreeGolds(freeGoldSum);
  100. gold.setTotalNum(totalNum);
  101. gold.setTaskGolds(taskGoldSum);
  102. gold.setSumGolds(permanentGoldSum+freeGoldSum+taskGoldSum);
  103. return gold;
  104. }
  105. @Override
  106. public Result addExportRecord(GoldDetailDTO dto) {
  107. // 获取操作者 jwcode
  108. HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  109. String token = request.getHeader("token");
  110. try {
  111. UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  112. dto.setAccount(Integer.valueOf(token1.getUsername()));
  113. } catch (Exception e) {
  114. throw new RuntimeException(e.getMessage());
  115. }
  116. String admin = adminService.getName(String.valueOf(dto.getAccount()));
  117. // 生成文件名
  118. String fileName = String.format("%s_%s_%s.xlsx",
  119. "客户金币明细",
  120. admin,
  121. LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
  122. System.out.println(fileName);
  123. dto.setUrl("");
  124. dto.setFileName(fileName);
  125. dto.setDataNum(0);
  126. try{
  127. // 调用方式
  128. GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder();
  129. goldDetailMapper.insertExportRecord(
  130. idHolder, // 用于接收主键
  131. dto.getAccount(),
  132. dto.getType(),
  133. dto.getState(),
  134. dto.getUrl(),
  135. dto.getFileName(),
  136. dto.getDataNum()
  137. );
  138. // 获取主键
  139. Long recordId = idHolder.getId();
  140. // 2. 构造完整的 JSON 数据(包含所有请求参数)
  141. Map<String, Object> exportData = new HashMap<>();
  142. exportData.put("recordId", recordId);
  143. // 手动构造请求数据(避免 toString() 只返回部分字段)
  144. Map<String, String> headers = new HashMap<>();
  145. Map<String, Object> requestData = new HashMap<>();
  146. requestData.put("token", token);
  147. requestData.put("goldDetail", dto.getGoldDetail());
  148. exportData.put("requestData", requestData);
  149. // 3. 发送到 Redis 消息队列
  150. String jsonData = new ObjectMapper().writeValueAsString(exportData);
  151. redisUtil.sendMessage("hwgold:queue:export_queue", jsonData);
  152. }catch (Exception e){
  153. e.printStackTrace();
  154. throw new SystemException("导出数据异常,请稍后重试", e);
  155. }
  156. return Result.success();
  157. }
  158. @Override
  159. public Result addExportRecordGold(GoldUserDTO dto) {
  160. // 获取操作者 jwcode
  161. HttpServletRequest request=((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
  162. String token = request.getHeader("token");
  163. try {
  164. UserDetails token1= JWTUtil.getUserDetailsList(String.valueOf(token), Admin.class);
  165. dto.setAccount(Integer.valueOf(token1.getUsername()));
  166. } catch (Exception e) {
  167. throw new RuntimeException(e.getMessage());
  168. }
  169. String admin = adminService.getName(String.valueOf(dto.getAccount()));
  170. // 生成文件名
  171. String fileName = String.format("%s_%s_%s.xlsx",
  172. "金币余额明细",
  173. admin,
  174. LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
  175. System.out.println(fileName);
  176. dto.setUrl("");
  177. dto.setFileName(fileName);
  178. dto.setDataNum(0);
  179. try{
  180. // 调用方式
  181. GoldDetailMapper.ExportRecordIdHolder idHolder = new GoldDetailMapper.ExportRecordIdHolder();
  182. goldDetailMapper.insertExportRecord(
  183. idHolder, // 用于接收主键
  184. dto.getAccount(),
  185. dto.getType(),
  186. dto.getState(),
  187. dto.getUrl(),
  188. dto.getFileName(),
  189. dto.getDataNum()
  190. );
  191. // 获取主键
  192. Long recordId = idHolder.getId();
  193. // 2. 构造完整的 JSON 数据(包含所有请求参数)
  194. Map<String, Object> exportData = new HashMap<>();
  195. exportData.put("recordId", recordId);
  196. // 手动构造请求数据(避免 toString() 只返回部分字段)
  197. Map<String, Object> requestData = new HashMap<>();
  198. requestData.put("token", token);
  199. requestData.put("user", dto.getUser());
  200. exportData.put("requestData", requestData);
  201. // 3. 发送到 Redis 消息队列
  202. String jsonData = new ObjectMapper().writeValueAsString(exportData);
  203. redisUtil.sendMessage("gold:queue:export_queue", jsonData);
  204. }catch (Exception e){
  205. e.printStackTrace();
  206. throw new SystemException("导出数据异常,请稍后重试", e);
  207. }
  208. return Result.success();
  209. }
  210. }