package com.izouma.nineth.web; import com.izouma.nineth.domain.BalanceRecord; import com.izouma.nineth.domain.ExportWithdraw; import com.izouma.nineth.domain.UserBalance; import com.izouma.nineth.dto.PageQuery; import com.izouma.nineth.exception.BusinessException; import com.izouma.nineth.repo.AutoWithdrawRecordRepo; import com.izouma.nineth.repo.BalanceRecordRepo; import com.izouma.nineth.repo.ExportWithdrawRepo; import com.izouma.nineth.repo.UserBalanceRepo; import com.izouma.nineth.service.UserBalanceService; import com.izouma.nineth.utils.DateTimeUtils; import com.izouma.nineth.utils.JpaUtils; import com.izouma.nineth.utils.SecurityUtils; import lombok.AllArgsConstructor; import org.apache.commons.io.IOUtils; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.springframework.core.io.InputStreamResource; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.time.Duration; import java.time.LocalDate; import java.util.concurrent.ExecutionException; @RestController @RequestMapping("/userBalance") @AllArgsConstructor public class UserBalanceController extends BaseController { private final UserBalanceRepo userBalanceRepo; private final BalanceRecordRepo balanceRecordRepo; private final UserBalanceService userBalanceService; private final ExportWithdrawRepo exportWithdrawRepo; private final RedisTemplate redisTemplate; private final AutoWithdrawRecordRepo autoWithdrawRecordRepo; @PostMapping("/all") @PreAuthorize("hasRole('ADMIN')") public Page all(@RequestBody PageQuery pageQuery) { return userBalanceRepo.findAll(JpaUtils.toSpecification(pageQuery, UserBalance.class), JpaUtils.toPageRequest(pageQuery)); } @PostMapping("/records") @PreAuthorize("hasRole('ADMIN')") public Page records(@RequestBody PageQuery pageQuery) { return balanceRecordRepo.findAll(JpaUtils.toSpecification(pageQuery, BalanceRecord.class), JpaUtils.toPageRequest(pageQuery)); } @PostMapping("/settle") @PreAuthorize("hasRole('ADMIN')") public void settle(@RequestParam LocalDate start, @RequestParam LocalDate end) { userBalanceService.settle(start, end); } @PostMapping(value = "/exportWithdraw") @PreAuthorize("hasRole('ADMIN')") public void exportWithdraw(String remark) throws IOException, InvalidFormatException { userBalanceService.exportWithdrawAsync(remark); } @PostMapping(value = "/exportHistory") @PreAuthorize("hasRole('ADMIN')") public Page exportHistory(Pageable pageable) { return exportWithdrawRepo.findAll(pageable); } @PostMapping("/importFail") @PreAuthorize("hasRole('ADMIN')") public void importFail(@RequestPart("withdrawList") MultipartFile withdrawFile, @RequestPart("failList") MultipartFile failFile) throws IOException { userBalanceService.importFail(withdrawFile, failFile); } @PostMapping("/autoWithdraw") @PreAuthorize("hasRole('ADMIN')") public void autoWithdraw() throws ExecutionException, InterruptedException { LocalDate date = LocalDate.now(); autoWithdrawRecordRepo.findByDate(date).ifPresent(a -> { throw new BusinessException("今日已经提现过"); }); userBalanceService.autoWithdraw(date); } @GetMapping("/my") public UserBalance my() { return userBalanceRepo.findById(SecurityUtils.getAuthenticatedUser().getId()).orElse(new UserBalance()); } @GetMapping("/my/record") public Page myRecord(Pageable pageable) { return balanceRecordRepo.findByUserId(SecurityUtils.getAuthenticatedUser().getId(), pageable); } // @PostMapping("/withdraw") // public void withdraw() { // userBalanceService.withdraw(SecurityUtils.getAuthenticatedUser().getId()); // } }