package com.xinquan.user.controller.client; import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import com.alibaba.nacos.common.utils.UuidUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.xinquan.common.core.constant.CacheConstants; import com.xinquan.common.core.domain.R; import com.xinquan.common.core.utils.WebUtils; import com.xinquan.common.core.utils.page.CollUtils; import com.xinquan.common.core.utils.page.PageDTO; import com.xinquan.common.log.enums.BusinessType; import com.xinquan.common.redis.service.RedisService; import com.xinquan.common.security.service.TokenService; import com.xinquan.course.api.domain.Course; import com.xinquan.order.api.domain.Order; import com.xinquan.system.api.domain.AppUserWalletRecord; import com.xinquan.user.api.domain.dto.OrderListDTO; import com.xinquan.system.api.domain.AppUser; import com.xinquan.system.api.domain.AppUserBank; import com.xinquan.system.api.domain.AppUserWithdraw; import com.xinquan.system.api.model.LoginUser; import com.xinquan.user.domain.export.WithdrawExport; import com.xinquan.user.service.AppUserBankService; import com.xinquan.user.service.AppUserService; import com.xinquan.user.service.AppUserWalletRecordService; import com.xinquan.user.service.AppUserWithdrawService; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.math.BigDecimal; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; /** *

* 用户提现表 前端控制器 *

* * @author mitao * @since 2024-08-21 */ @RestController @RequestMapping("/client/app-user-withdraw") public class ClientAppUserWithdrawController { @Resource private AppUserService appUserService; @Resource private AppUserWithdrawService withdrawService; @Resource private AppUserBankService appUserBankService; @Autowired private TokenService tokenService; @Resource private AppUserWalletRecordService appUserWalletRecordService; @Autowired private RedisService redisService; @PostMapping("/withdrawList") @ApiOperation(value = "提现列表-分页", tags = {"管理后台-提现管理"}) public R> withdrawList(@RequestBody OrderListDTO courseDTO) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasLength(courseDTO.getBuyContent())){ wrapper.like(AppUserWithdraw::getCode,courseDTO.getBuyContent()); } if (StringUtils.hasLength(courseDTO.getUserNameOrPhone())){ List collect = appUserService.lambdaQuery().like(AppUser::getCellPhone, courseDTO.getUserNameOrPhone()) .list().stream().map(AppUser::getId) .collect(Collectors.toList()); List collect1 = appUserService.lambdaQuery().like(AppUser::getNickname, courseDTO.getUserNameOrPhone()) .list().stream().map(AppUser::getId) .collect(Collectors.toList()); collect.addAll(collect1); if (collect.isEmpty())collect.add(-1L); wrapper.in(AppUserWithdraw::getAppUserId,collect); } if (courseDTO.getPaymentStatus()!=null && courseDTO.getPaymentStatus()==1){ wrapper.eq(AppUserWithdraw::getId,0); }else if (courseDTO.getPaymentStatus()!=null &&(courseDTO.getPaymentStatus()==2 || courseDTO.getPaymentStatus()==3)){ List integers = new ArrayList<>(); integers.add(1); integers.add(2); wrapper.in(AppUserWithdraw::getWithdrawStatus,integers); } if (StringUtils.hasLength(courseDTO.getTime())){ String startTime =null; String endTime =null; String[] split = courseDTO.getTime().split(" - "); startTime = split[0]+" 00:00:00"; endTime = split[1]+" 23:59:59"; wrapper.between(AppUserWithdraw::getWithdrawTime,startTime,endTime); } Page list = withdrawService.page(new Page<>(courseDTO.getPageCurr(), courseDTO.getPageSize()), wrapper); if (CollUtils.isEmpty(list.getRecords())) { return R.ok(PageDTO.empty(list)); } for (AppUserWithdraw record : list.getRecords()) { record.setUid(record.getId()+""); AppUser byId = appUserService.getById(record.getAppUserId()); if(byId!=null){ record.setUserName(byId.getNickname()); record.setCellPhone(byId.getCellPhone()); record.setAvatar(byId.getAvatar()); } } return R.ok(PageDTO.of(list, AppUserWithdraw.class)); } @ApiOperation(value = "提现管理导出", tags = {"管理后台-提现管理"}) @PutMapping("/export") public void export(@RequestBody OrderListDTO courseDTO) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasLength(courseDTO.getIds())){ wrapper.in(AppUserWithdraw::getId, Arrays.asList(courseDTO.getIds().split(","))); } if (StringUtils.hasLength(courseDTO.getBuyContent())){ wrapper.like(AppUserWithdraw::getCode,courseDTO.getBuyContent()); } if (StringUtils.hasLength(courseDTO.getUserNameOrPhone())){ List collect = appUserService.lambdaQuery().like(AppUser::getCellPhone, courseDTO.getUserNameOrPhone()) .list().stream().map(AppUser::getId) .collect(Collectors.toList()); if (collect.isEmpty())collect.add(-1L); wrapper.in(AppUserWithdraw::getAppUserId,collect); } if (courseDTO.getPaymentStatus()!=null && courseDTO.getPaymentStatus()==1){ wrapper.eq(AppUserWithdraw::getId,0); }else if (courseDTO.getPaymentStatus()!=null &&(courseDTO.getPaymentStatus()==2 || courseDTO.getPaymentStatus()==3)){ List integers = new ArrayList<>(); integers.add(1); integers.add(2); wrapper.in(AppUserWithdraw::getWithdrawStatus,integers); } if (StringUtils.hasLength(courseDTO.getTime())){ String startTime =null; String endTime =null; String[] split = courseDTO.getTime().split(" - "); startTime = split[0]+"00:00:00"; endTime = split[1]+"23:59:59"; wrapper.between(AppUserWithdraw::getWithdrawTime,startTime,endTime); } List list = withdrawService.list(wrapper); List withdrawExports = new ArrayList<>(); for (AppUserWithdraw record : list) { WithdrawExport withdrawExport = new WithdrawExport(); record.setUid(record.getId()+""); AppUser byId = appUserService.getById(record.getAppUserId()); if(byId!=null){ withdrawExport.setUserName(byId.getNickname()); withdrawExport.setCellphone(byId.getCellPhone()); } withdrawExport.setCode(record.getCode()); withdrawExport.setAmount("¥"+record.getAmount()+""); withdrawExport.setWithdrawType("1"); withdrawExport.setWithdrawStatus(record.getWithdrawStatus()+""); DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); String format = df.format(record.getCreateTime()); withdrawExport.setCreateTime(format); withdrawExports.add(withdrawExport); } Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), WithdrawExport.class, withdrawExports); HttpServletResponse response = WebUtils.response(); response.setContentType("application/vnd.ms-excel"); response.setCharacterEncoding("utf-8"); ServletOutputStream outputStream = null; try { String fileName = URLEncoder.encode("提现管理导出.xls", "utf-8"); response.setHeader("Content-Disposition", "attachment;filename=" + fileName); response.setContentType("application/vnd.ms-excel;charset=UTF-8"); response.setHeader("Pragma", "no-cache"); response.setHeader("Cache-Control", "no-cache"); outputStream = response.getOutputStream(); workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } finally { try { outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } @PostMapping("/withdrawInfo") @ApiOperation(value = "提现列表-查看详情", tags = {"管理后台-提现管理"}) public R withdrawList(String uid){ AppUserWithdraw byId = withdrawService.getById(uid); return R.ok(byId); } /** * 远程调用获取提现记录 */ @PostMapping("/getWithdrawList") public R> getWithdraw(@RequestBody OrderListDTO courseDTO) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); if (StringUtils.hasLength(courseDTO.getBuyContent())){ if (!courseDTO.getBuyContent().contains("提现")){ wrapper.like(AppUserWithdraw::getCode,courseDTO.getBuyContent()); } } if (StringUtils.hasLength(courseDTO.getUserNameOrPhone())){ List collect = appUserService.lambdaQuery().like(AppUser::getCellPhone, courseDTO.getUserNameOrPhone()) .list().stream().map(AppUser::getId) .collect(Collectors.toList()); if (collect.isEmpty())collect.add(-1L); wrapper.in(AppUserWithdraw::getAppUserId,collect); } if (courseDTO.getOrderFrom()!=null && courseDTO.getOrderFrom()!=5){ wrapper.eq(AppUserWithdraw::getId,0); } if (courseDTO.getPayType()!=null && courseDTO.getPayType()!=4){ wrapper.eq(AppUserWithdraw::getId,0); } if (courseDTO.getPaymentStatus()!=null && courseDTO.getPaymentStatus()==1){ wrapper.eq(AppUserWithdraw::getId,0); }else if (courseDTO.getPaymentStatus()!=null &&(courseDTO.getPaymentStatus()==2 || courseDTO.getPaymentStatus()==3)){ List integers = new ArrayList<>(); integers.add(1); integers.add(2); wrapper.in(AppUserWithdraw::getWithdrawStatus,integers); } if (StringUtils.hasLength(courseDTO.getTime())){ String startTime =null; String endTime =null; String[] split = courseDTO.getTime().split(" - "); startTime = split[0]+"00:00:00"; endTime = split[1]+"23:59:59"; wrapper.between(AppUserWithdraw::getWithdrawTime,startTime,endTime); } List list = withdrawService.list(wrapper); return R.ok(list); } @PostMapping("/withdraw") @ApiOperation(value = "提现", tags = {"钱包"}) @ApiImplicitParams({ @ApiImplicitParam(name = "bankId", value = "银行卡id", dataType = "Long", required = true), @ApiImplicitParam(name = "money", value = "提现金额", dataType = "String", required = true) }) public R withdraw(Long bankId,String money) { LoginUser loginUser = tokenService.getLoginUser(); if (loginUser==null){ return R.tokenError("登录失效"); } Long userId = loginUser.getUserid(); AppUser byId = appUserService.getById(userId); if (byId.getBalance().compareTo(new BigDecimal(money))<0){ return R.fail("提现金额不能超过钱包余额"); } byId.setBalance(byId.getBalance().subtract(new BigDecimal(money))); appUserService.updateById(byId); BigDecimal bigDecimal = new BigDecimal(money); AppUserWithdraw appUserWithdraw = new AppUserWithdraw(); appUserWithdraw.setAppUserId(userId); appUserWithdraw.setBankId(bankId); appUserWithdraw.setAmount(bigDecimal); appUserWithdraw.setWithdrawType(1); appUserWithdraw.setWithdrawStatus(0); // todo 提现流水号 appUserWithdraw.setSerialNo(UuidUtils.generateUuid()); appUserWithdraw.setCode(UuidUtils.generateUuid()); appUserWithdraw.setWithdrawTime(LocalDateTime.now()); appUserWithdraw.setCreateTime(LocalDateTime.now()); withdrawService.save(appUserWithdraw); // 先扣去余额 AppUserWalletRecord appUserWalletRecord = new AppUserWalletRecord(); appUserWalletRecord.setAppUserId(userId); appUserWalletRecord.setChangeType(2); appUserWalletRecord.setReason("提现"); appUserWalletRecord.setOrderId(appUserWithdraw.getId()); appUserWalletRecord.setAmount(new BigDecimal(money)); appUserWalletRecordService.save(appUserWalletRecord); return R.ok(); } @PostMapping("/addBank") @ApiOperation(value = "提现-添加银行卡", tags = {"钱包"}) public R wallet(@RequestBody AppUserBank appUserWithdraw) { LoginUser loginUser = tokenService.getLoginUser(); if (loginUser==null){ return R.tokenError("登录失效"); } Long userId = loginUser.getUserid(); appUserWithdraw.setAppUserId(userId); // Boolean flag = redisService.hasKey(CacheConstants.ADD_CARD_PHONE_CODE_PREFIX + appUserWithdraw.getCellPhone()); // if(!flag){ // return R.fail("验证码已失效,请重新获取"); // } // String code = redisService.getCacheObject(CacheConstants.ADD_CARD_PHONE_CODE_PREFIX + appUserWithdraw.getCellPhone()); // if (!appUserWithdraw.getCode().equals(code)) { // return R.fail("验证码不正确"); // } appUserBankService.save(appUserWithdraw); return R.ok(); } @PostMapping("/deleteBank") @ApiOperation(value = "提现-删除银行卡", tags = {"钱包"}) public R deleteBank(Long id) { LoginUser loginUser = tokenService.getLoginUser(); if (loginUser==null){ return R.tokenError("登录失效"); } Long userId = loginUser.getUserid(); if(userId ==null || userId == 0)return R.tokenError("登录失效"); appUserBankService.removeById(id); return R.ok(); } @PostMapping("/bankList") @ApiOperation(value = "提现-获取银行卡列表", tags = {"钱包"}) public R> bankList() { LoginUser loginUser = tokenService.getLoginUser(); if (loginUser==null){ return R.tokenError("登录失效"); } Long userId = loginUser.getUserid(); if(userId ==null || userId == 0)return R.tokenError("登录失效"); List list = appUserBankService.lambdaQuery() .eq(AppUserBank::getAppUserId, userId).list(); return R.ok(list); } }