From c72910d2b90f74d23e770717d80921b4fd064d48 Mon Sep 17 00:00:00 2001 From: 无关风月 <443237572@qq.com> Date: 星期二, 16 九月 2025 16:24:08 +0800 Subject: [PATCH] 新增用户提现 --- ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 174 insertions(+), 4 deletions(-) diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java index 77eae82..b4ceb83 100644 --- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java +++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/AppUserController.java @@ -14,11 +14,13 @@ import com.ruoyi.account.mapper.AppUserMapper; import com.ruoyi.account.service.*; import com.ruoyi.account.util.ObsUploadUtil; +import com.ruoyi.account.util.UUIDUtil; import com.ruoyi.account.util.weChat.EnvVersion; import com.ruoyi.account.util.weChat.WeChatUtil; import com.ruoyi.account.vo.*; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.domain.R; +import com.ruoyi.common.core.exception.ServiceException; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.poi.ExcelUtil; import com.ruoyi.common.core.web.controller.BaseController; @@ -29,6 +31,8 @@ import com.ruoyi.order.feignClient.RemoteOrderGoodsClient; import com.ruoyi.order.model.Order; import com.ruoyi.other.api.domain.Shop; +import com.ruoyi.other.api.domain.ShopBalanceStatement; +import com.ruoyi.other.api.domain.ShopWithdraw; import com.ruoyi.other.api.feignClient.ShopClient; import com.ruoyi.system.api.domain.SysConfig; import com.ruoyi.system.api.domain.SysUser; @@ -39,14 +43,25 @@ import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.annotations.Param; import org.springframework.beans.factory.annotation.Value; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; + import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; +import java.io.File; import java.io.IOException; import java.math.BigDecimal; +import java.math.RoundingMode; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.*; @@ -71,6 +86,12 @@ private TokenService tokenService; @Resource private AppUserService appUserService; + @Resource + private IUserWithdrawService userWithdrawService; + @Resource + private UserPointService userPointService; + @Resource + private AppUserBankService appUserBankService; @Resource private AppUserMapper appUserMapper; @Resource @@ -97,6 +118,82 @@ @Value("${file.upload.location}") private String filePath; + @PostMapping("/verifyBankInfo") + @ApiOperation(value = "用户提现前校验银行卡信息") + public R<Boolean> mobileLogin() { + LoginUser loginUserApplet = tokenService.getLoginUserApplet(); + AppUser appUser = appUserService.getById(loginUserApplet.getUserid()); + AppUserBank bank = appUserBankService.lambdaQuery().eq(AppUserBank::getAppUserId, appUser.getId()).last("limit 1") + .one(); + if (bank == null){ + return R.ok(false); + }else{ + return R.ok(true); + } + } + @ApiOperation(value = "提现申请") + @GetMapping("/withdrawalApplication") + @ResponseBody + public R withdrawalApplication(@ApiParam("提现金额") @RequestParam BigDecimal money) { + LoginUser loginUser = tokenService.getLoginUserApplet(); + SysConfig data = sysConfigClient.getInfo(8L).getData(); + AppUser appUser = appUserService.getById(loginUser.getUserid()); + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); + String code = sdf.format(new Date()) + UUIDUtil.getNumberRandom(5); + money=money.setScale(2, BigDecimal.ROUND_HALF_DOWN); + if (money.compareTo(BigDecimal.ZERO)==0){ + throw new ServiceException("提现金额必须大于零"); + } + Integer rate = Integer.valueOf(data.getConfigValue()); + BigDecimal availablePoint = new BigDecimal(appUser.getAvailablePoint()); + BigDecimal unMoney = availablePoint.divide(BigDecimal.valueOf(rate), 2, RoundingMode.HALF_DOWN); + if (unMoney.compareTo( money)<0){ + throw new ServiceException("提现金额不能大于可提现金额,当前可提现金额为:"+unMoney); + } + AppUserBank bank = appUserBankService.lambdaQuery().eq(AppUserBank::getAppUserId, appUser.getId()).last("limit 1") + .one(); + if(bank==null){ + throw new ServiceException("请完善账户信息后再申请提现!"); + } + if(!org.springframework.util.StringUtils.hasLength(bank.getBankNumber())){ + throw new ServiceException("请完善银行卡后再申请提现!"); + } + // 增加用户提现积分变动记录 + UserPoint one = userPointService.lambdaQuery().eq(UserPoint::getAppUserId, appUser.getId()) + .orderByDesc(UserPoint::getCreateTime).last("limit 1").one(); + UserWithdraw userWithdraw = new UserWithdraw(); + userWithdraw.setAppUserId(appUser.getId()); + userWithdraw.setMoney(money); + BigDecimal multiply = money.multiply(BigDecimal.valueOf(rate)); + appUser.setAvailablePoint(appUser.getAvailablePoint()-multiply.setScale(0, RoundingMode.HALF_UP).intValue()); + if (multiply.compareTo(new BigDecimal(appUser.getAvailablePoint()))>0){ + throw new ServiceException("积分不足!"); + } + userWithdraw.setIntegral(Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString())); + userWithdraw.setAuditStatus(0); + userWithdraw.setStatus(1); + userWithdraw.setCode(code); + userWithdraw.setCreateTime(LocalDateTime.now()); + if (one.getBalance() - Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString())<0){ + throw new ServiceException("积分不足!"); + } + userWithdraw.setReceiverAccountNoEnc(bank.getBankNumber()); + userWithdraw.setReceiverNameEnc(bank.getUserName()); + userWithdraw.setReceiverBankChannelNo(bank.getReceiverBankChannelNo()); + userWithdraw.setReceiverAccountType(201); + userWithdrawService.save(userWithdraw); + UserPoint userPoint = new UserPoint(); + userPoint.setType(18); + userPoint.setVariablePoint(Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString())); + userPoint.setHistoricalPoint(one.getBalance()); + userPoint.setBalance(one.getBalance() - Integer.valueOf(multiply.setScale(0, RoundingMode.HALF_UP).toString())); + userPoint.setCreateTime(LocalDateTime.now()); + userPoint.setAppUserId(appUser.getId()); + userPoint.setObjectId(userWithdraw.getId()); + userPointService.save(userPoint); + appUserService.updateById(appUser); + return R.ok(); + } @ResponseBody @PostMapping("/mobileLogin") @@ -133,6 +230,11 @@ public AppUser getAppUserById(@RequestParam("id") Long id) { System.out.println("根据id获取用户:"+id); return appUserService.getById(id); + } + // 获取所有用户 + @PostMapping("/getAppUserAll") + public List<AppUser> getAppUserAll() { + return appUserService.list(); } @PostMapping("/getBaseUserById") @@ -557,7 +659,7 @@ if (result == null || result.get("total_points") == null) { userStatistics.setTotalScore(0L); }else { - userStatistics.setTotalScore((Long) result.get("total_points")); + userStatistics.setTotalScore(Long.valueOf(result.get("total_points").toString())); } //条件构造 消费积分现金支付金额 queryWrapper.clear(); @@ -622,7 +724,7 @@ * @param file * @return */ - @PostMapping("/upload") + /* @PostMapping("/upload") public R upload(MultipartFile file){ String s = null; try { @@ -631,9 +733,77 @@ throw new RuntimeException(e); } return R.ok(s); + }*/ + + private static final String FILE_DIRECTORY = "/dev/xvdb/project/upload_files"; // Linux路径 +// private static final String FILE_DIRECTORY = "E://ldf_files"; // Linux路径 + + @PostMapping("/upload") + public R handleFileUpload(@RequestParam("file") MultipartFile file) { + if (file.isEmpty()) { + return R.fail("请选择一个文件上传"); + } + try { + // 1. 构建日期目录路径(格式:/年/月/日) + LocalDate today = LocalDate.now(); + String datePath = String.format("/%d/%02d/%02d", + today.getYear(), today.getMonthValue(), today.getDayOfMonth()); + + // 2. 完整目标目录路径 + String fullDirPath = FILE_DIRECTORY + datePath; + File targetDir = new File(fullDirPath); + + // 3. 自动创建目录(如果不存在) + if (!targetDir.exists()) { + targetDir.mkdirs(); // 递归创建所有父目录 + } + String UUID= java.util.UUID.randomUUID().toString(); + // 4. 保存文件 + String filePath = fullDirPath + "/" +UUID+ file.getOriginalFilename(); + File targetFile = new File(filePath); + file.transferTo(targetFile); + // 5. 返回可访问的URL(修正路径分隔符为Web格式) + return R.ok("https://zjrqxny.com/images" + datePath + "/" + UUID+file.getOriginalFilename()); + } catch (IOException e) { + e.printStackTrace(); + return R.fail("上传文件失败"); + } } - - + @GetMapping("/download/{year}/{month}/{day}/{fileName:.+}") + @ResponseBody + public ResponseEntity<org.springframework.core.io.Resource> downloadFile( @PathVariable String year, + @PathVariable String month, + @PathVariable String day, + @PathVariable String fileName) { + System.out.println("下载文件名:"+fileName); + try { + // 1. 解码文件名 + String decodedFileName = URLDecoder.decode(fileName, "UTF-8"); + + + java.nio.file.Path filePath = java.nio.file.Paths.get(FILE_DIRECTORY, year, month, day, decodedFileName).normalize(); + org.springframework.core.io.Resource resource = new org.springframework.core.io.UrlResource(filePath.toUri()); + if (resource.exists() || resource.isReadable()) { + // 5. 设置下载头(兼容所有浏览器) + String contentDisposition = "attachment; filename=\"" + decodedFileName + "\"; " + + "filename*=UTF-8''" + URLEncoder.encode(decodedFileName, "UTF-8").replace("+", "%20"); + + return ResponseEntity.ok() + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .header(HttpHeaders.CONTENT_DISPOSITION, contentDisposition) + .body(resource); + + } else { + return ResponseEntity.notFound().build(); + } + } catch (IOException ex) { + ex.printStackTrace(); + return ResponseEntity.status(500).build(); + } + } + + + /** * 清空绑定门店的用户门店数据 -- Gitblit v1.7.1