UserBalanceController.java 5.9 KB

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