无关风月
4 天以前 c72910d2b90f74d23e770717d80921b4fd064d48
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();
        }
    }
    /**
     * 清空绑定门店的用户门店数据