UserBalanceController.java 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. package com.izouma.nineth.web;
  2. import cn.hutool.core.math.Money;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.github.kevinsawicki.http.HttpRequest;
  6. import com.izouma.nineth.domain.BalanceRecord;
  7. import com.izouma.nineth.domain.ExportWithdraw;
  8. import com.izouma.nineth.domain.RechargeOrder;
  9. import com.izouma.nineth.domain.UserBalance;
  10. import com.izouma.nineth.dto.PageQuery;
  11. import com.izouma.nineth.enums.BalanceType;
  12. import com.izouma.nineth.enums.OrderStatus;
  13. import com.izouma.nineth.enums.PayMethod;
  14. import com.izouma.nineth.exception.BusinessException;
  15. import com.izouma.nineth.repo.*;
  16. import com.izouma.nineth.service.UserBalanceService;
  17. import com.izouma.nineth.utils.DateTimeUtils;
  18. import com.izouma.nineth.utils.JpaUtils;
  19. import com.izouma.nineth.utils.SecurityUtils;
  20. import com.izouma.nineth.utils.SnowflakeIdWorker;
  21. import lombok.AllArgsConstructor;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.apache.commons.io.IOUtils;
  24. import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
  25. import org.springframework.core.io.InputStreamResource;
  26. import org.springframework.data.domain.Page;
  27. import org.springframework.data.domain.Pageable;
  28. import org.springframework.data.redis.core.RedisTemplate;
  29. import org.springframework.http.MediaType;
  30. import org.springframework.http.ResponseEntity;
  31. import org.springframework.security.access.prepost.PreAuthorize;
  32. import org.springframework.web.bind.annotation.*;
  33. import org.springframework.web.multipart.MultipartFile;
  34. import java.io.File;
  35. import java.io.FileInputStream;
  36. import java.io.IOException;
  37. import java.math.BigDecimal;
  38. import java.time.Duration;
  39. import java.time.LocalDate;
  40. import java.util.concurrent.ExecutionException;
  41. @RestController
  42. @RequestMapping("/userBalance")
  43. @AllArgsConstructor
  44. @Slf4j
  45. public class UserBalanceController extends BaseController {
  46. private final UserBalanceRepo userBalanceRepo;
  47. private final BalanceRecordRepo balanceRecordRepo;
  48. private final UserBalanceService userBalanceService;
  49. private final ExportWithdrawRepo exportWithdrawRepo;
  50. private final RedisTemplate<String, Object> redisTemplate;
  51. private final AutoWithdrawRecordRepo autoWithdrawRecordRepo;
  52. private final RechargeOrderRepo rechargeOrderRepo;
  53. private final SnowflakeIdWorker snowflakeIdWorker;
  54. @PostMapping("/all")
  55. @PreAuthorize("hasAnyRole('ADMIN','ORDERINFO')")
  56. public Page<UserBalance> all(@RequestBody PageQuery pageQuery) {
  57. return userBalanceRepo
  58. .findAll(JpaUtils.toSpecification(pageQuery, UserBalance.class), JpaUtils.toPageRequest(pageQuery));
  59. }
  60. @PostMapping("/records")
  61. @PreAuthorize("hasAnyRole('ADMIN','ORDERINFO')")
  62. public Page<BalanceRecord> records(@RequestBody PageQuery pageQuery) {
  63. return balanceRecordRepo
  64. .findAll(JpaUtils.toSpecification(pageQuery, BalanceRecord.class), JpaUtils.toPageRequest(pageQuery));
  65. }
  66. @PostMapping("/settle")
  67. @PreAuthorize("hasRole('ADMIN')")
  68. public void settle(@RequestParam LocalDate start, @RequestParam LocalDate end) {
  69. userBalanceService.settle(start, end);
  70. }
  71. @PostMapping(value = "/exportWithdraw")
  72. @PreAuthorize("hasRole('ADMIN')")
  73. public void exportWithdraw(String remark) throws IOException, InvalidFormatException {
  74. userBalanceService.exportWithdrawAsync(remark);
  75. }
  76. @PostMapping(value = "/exportHistory")
  77. @PreAuthorize("hasRole('ADMIN')")
  78. public Page<ExportWithdraw> exportHistory(Pageable pageable) {
  79. return exportWithdrawRepo.findAll(pageable);
  80. }
  81. @PostMapping("/importFail")
  82. @PreAuthorize("hasRole('ADMIN')")
  83. public void importFail(@RequestPart("withdrawList") MultipartFile withdrawFile,
  84. @RequestPart("failList") MultipartFile failFile) throws IOException {
  85. userBalanceService.importFail(withdrawFile, failFile);
  86. }
  87. @PostMapping("/autoWithdraw")
  88. @PreAuthorize("hasRole('ADMIN')")
  89. public void autoWithdraw() throws ExecutionException, InterruptedException {
  90. LocalDate date = LocalDate.now();
  91. autoWithdrawRecordRepo.findByDate(date).ifPresent(a -> {
  92. throw new BusinessException("今日已经提现过");
  93. });
  94. userBalanceService.autoWithdraw(date);
  95. }
  96. @GetMapping("/my")
  97. public UserBalance my() {
  98. return userBalanceRepo.findById(SecurityUtils.getAuthenticatedUser().getId())
  99. .orElse(new UserBalance(SecurityUtils.getAuthenticatedUser().getId()));
  100. }
  101. @GetMapping("/my/record")
  102. public Page<BalanceRecord> myRecord(Pageable pageable) {
  103. return balanceRecordRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId(), pageable);
  104. }
  105. // @PostMapping("/withdraw")
  106. // public void withdraw() {
  107. // userBalanceService.withdraw(SecurityUtils.getAuthenticatedUser().getId());
  108. // }
  109. @PostMapping(value = "/iap")
  110. public String iap(@RequestParam String receiptData) {
  111. String data = "{\"receipt-data\":\"" + receiptData + "\"}";
  112. String body = HttpRequest.post("https://buy.itunes.apple.com/verifyReceipt")
  113. .contentType("application/json")
  114. .send(data)
  115. .body();
  116. JSONObject jsonObject = JSON.parseObject(body);
  117. int status = jsonObject.getInteger("status");
  118. if (status == 21007) {
  119. jsonObject = JSON.parseObject(HttpRequest.post("https://sandbox.itunes.apple.com/verifyReceipt")
  120. .contentType("application/json")
  121. .send(data)
  122. .body());
  123. status = jsonObject.getInteger("status");
  124. }
  125. log.info("verifyReceipt {}", JSON.toJSONString(jsonObject, true));
  126. if (status == 0) {
  127. JSONObject inApp = jsonObject.getJSONObject("receipt").getJSONArray("in_app").getJSONObject(0);
  128. BigDecimal amount = inApp.getBigDecimal("product_id");
  129. userBalanceService.modifyBalance(SecurityUtils.getAuthenticatedUser().getId(), amount, BalanceType.RECHARGE,
  130. null, false, null);
  131. }
  132. return "ok";
  133. }
  134. @PostMapping("/testRecharge")
  135. @PreAuthorize("hasRole('ADMIN')")
  136. public void testRecharge(Long userId, BigDecimal money) {
  137. RechargeOrder rechargeOrder = RechargeOrder.builder()
  138. .id(snowflakeIdWorker.nextId())
  139. .amount(money)
  140. .userId(userId)
  141. .status(OrderStatus.NOT_PAID)
  142. .payMethod(PayMethod.BALANCE)
  143. .transactionId("5675466754643563452344")
  144. .build();
  145. rechargeOrder = rechargeOrderRepo.save(rechargeOrder);
  146. userBalanceService.recharge(rechargeOrder.getId(), PayMethod.BALANCE, "5675466754643563452344");
  147. }
  148. }