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 90d1020..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(((BigDecimal) result.get("total_points")).longValue());
+            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