From efdb99f8cecc4afb592afad79c761081d5d5cf22 Mon Sep 17 00:00:00 2001
From: lee <4766465@qq.com>
Date: Wed, 18 Dec 2024 13:27:00 +0800
Subject: [PATCH] init

---
 yami-shop-api/src/main/java/com/yami/shop/api/controller/cdn/CdnMyWalletController.java |  638 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 638 insertions(+), 0 deletions(-)

diff --git a/yami-shop-api/src/main/java/com/yami/shop/api/controller/cdn/CdnMyWalletController.java b/yami-shop-api/src/main/java/com/yami/shop/api/controller/cdn/CdnMyWalletController.java
new file mode 100644
index 0000000..65e405a
--- /dev/null
+++ b/yami-shop-api/src/main/java/com/yami/shop/api/controller/cdn/CdnMyWalletController.java
@@ -0,0 +1,638 @@
+package com.yami.shop.api.controller.cdn;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.param.*;
+import com.yami.shop.common.bean.HuaWeiOss;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.enums.WalletEnum;
+import com.yami.shop.common.i18n.I18nMessage;
+import com.yami.shop.common.response.ResponseEnum;
+import com.yami.shop.common.response.ServerResponseEntity;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.service.*;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Parameters;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.lang.reflect.Type;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.regex.Pattern;
+
+@RestController
+@RequestMapping("/cdn/myWallet")
+@Tag(name = "钱包相关")
+public class CdnMyWalletController {
+    @Autowired
+    private CdnUserWalletService cdnUserWalletService;
+    @Autowired
+    private CdnFlowService cdnFlowService;
+    @Autowired
+    private UserService userService;
+    @Autowired
+    private CdnUserRechargeService cdnUserRechargeService;
+    @Autowired
+    private CdnUserBankService cdnUserBankService;
+    @Autowired
+    private CdnConfigService cdnConfigService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    @Autowired
+    private CdnWithdrawalService cdnWithdrawalService;
+    @Autowired
+    private CdnWalletService cdnWalletService;
+    @Autowired
+    private CdnFlownameService cdnFlownameService;
+    @Autowired
+    private CdnTeamRelationService cdnTeamRelationService;
+
+
+    private static final Pattern NUMERIC_PATTERN = Pattern.compile("\\d+");
+
+    @GetMapping("/getWalletDetail")
+    @Operation(summary = "查看明细", description = "查看明细")
+    @Parameters({
+            @Parameter(name = "userId", description = "用户id"),
+            @Parameter(name = "page", description = "当前页"),
+            @Parameter(name = "pageSize", description = "每页条数"),
+            @Parameter(name = "walletId", description = "币种id 8流量 9金牛豆 10 幸运池 11积分")
+    })
+    public ServerResponseEntity<CdnUserWalletParam> getWalletDetail(@RequestParam(name = "userId") String userId,
+                                                                    @RequestParam(name = "page") Integer page,
+                                                                    @RequestParam(name = "pageSize") Integer pageSize,
+                                                                    @RequestParam(name = "walletId") Integer walletId) {
+        CdnUserWallet cdnUserWallet = cdnUserWalletService.getOne(Wrappers.<CdnUserWallet>lambdaQuery()
+                .eq(CdnUserWallet::getUserId, userId)
+                .eq(CdnUserWallet::getWalletId, walletId));
+        Page<CdnFlow> p = new Page<>(page, pageSize);
+        IPage<CdnFlow> flows = cdnFlowService.page(p, Wrappers.lambdaQuery(CdnFlow.class)
+                .eq(CdnFlow::getUserId, userId)
+                .eq(CdnFlow::getWalletId, walletId)
+                .eq(CdnFlow::getDelStatus, 0)
+                .orderByDesc(CdnFlow::getCreateTime)
+                .orderByAsc(CdnFlow::getId));
+        if (!flows.getRecords().isEmpty()) {
+            for (CdnFlow flow : flows.getRecords()) {
+                CdnFlowname cdnFlowname = cdnFlownameService.getOne(Wrappers.<CdnFlowname>lambdaQuery().eq(CdnFlowname::getId, flow.getFlownameId()));
+                flow.setFlowname(cdnFlowname != null ? cdnFlowname.getName() : "无");
+            }
+        }
+        CdnUserWalletParam userWalletParam = new CdnUserWalletParam();
+        userWalletParam.setBalance(cdnUserWallet.getMoney());
+        userWalletParam.setFlows(flows);
+        return ServerResponseEntity.success(userWalletParam);
+    }
+
+    @GetMapping("/isPayPassword")
+    @Operation(summary = "查看是否设置支付密码", description = "查看是否设置支付密码")
+    public ServerResponseEntity<Boolean> isPayPassword(@RequestParam(name = "userId") String userId) {
+        User user = userService.getById(userId);
+        if (user.getPayPassword() == null || user.getPayPassword().equals("")) {
+            return ServerResponseEntity.success(false);
+        }
+        return ServerResponseEntity.success(true);
+    }
+
+    @PostMapping("/setPayPassword")
+    @Operation(summary = "设置支付密码", description = "设置支付密码")
+    public ServerResponseEntity setPayPassword(@RequestBody PayPasswordParam setPayPasswordParam) {
+        if (setPayPasswordParam.getPayPassword().length() > 6) {
+            return ServerResponseEntity.showFailMsg("密码格式错误");
+        }
+        User user = userService.getById(setPayPasswordParam.getUserId());
+        if (user != null) {
+            if (user.getPayPassword() == null) {
+                String ppw = encryptWithMD5(setPayPasswordParam.getPayPassword());
+                user.setPayPassword(ppw);
+                userService.updateById(user);
+                return ServerResponseEntity.success();
+            }
+            String ppw = encryptWithMD5(setPayPasswordParam.getPayPassword());
+            if (user.getPayPassword().equals(ppw)) {
+                return ServerResponseEntity.showFailMsg("不能与原密码一致");
+            }
+            user.setPayPassword(ppw);
+            userService.updateById(user);
+        } else {
+            return ServerResponseEntity.showFailMsg("用户不存在");
+        }
+        return ServerResponseEntity.success();
+    }
+
+    @PostMapping("/modifyPayPassword")
+    @Operation(summary = "修改支付密码", description = "修改支付密码")
+    public ServerResponseEntity modifyPayPassword(@Valid @RequestBody SetPayPasswordParam payPasswordParam) {
+        if (payPasswordParam.getOldPayPassword().length() > 6 || !isNumericPayPassword(payPasswordParam.getOldPayPassword())) {
+            return ServerResponseEntity.showFailMsg("旧密码格式错误");
+        }
+        if (payPasswordParam.getNewPayPassword().length() > 6 || !isNumericPayPassword(payPasswordParam.getNewPayPassword())) {
+            return ServerResponseEntity.showFailMsg("新密码格式错误");
+        }
+        if (!payPasswordParam.getConfirmPayPassword().equals(payPasswordParam.getNewPayPassword())) {
+            return ServerResponseEntity.showFailMsg("密码和确认密码不一致");
+        }
+        if (payPasswordParam.getOldPayPassword().equals(payPasswordParam.getNewPayPassword())) {
+            return ServerResponseEntity.showFailMsg("新密码不能与旧密码一致");
+        }
+        User user = userService.getById(payPasswordParam.getUserId());
+        if (user != null) {
+            if (user.getPayPassword() == null) {
+                return ServerResponseEntity.showFailMsg("支付密码还未设置,不能修改");
+            }
+            String old = encryptWithMD5(payPasswordParam.getOldPayPassword());
+            if (!old.equals(user.getPayPassword())) {
+                return ServerResponseEntity.showFailMsg("旧密码输入错误");
+            }
+            String ppw = encryptWithMD5(payPasswordParam.getNewPayPassword());
+            user.setPayPassword(ppw);
+            userService.updateById(user);
+        } else {
+            return ServerResponseEntity.showFailMsg("用户不存在");
+        }
+        return ServerResponseEntity.success();
+    }
+    @PostMapping("/pay/vaildPwd")
+    @Operation(summary = "校验支付密码", description = "校验支付密码")
+    public ServerResponseEntity vaildPayPassword(@RequestBody PayPasswordParam setPayPasswordParam) {
+        if (setPayPasswordParam.getPayPassword().length() > 6) {
+            return ServerResponseEntity.showFailMsg("密码格式错误");
+        }
+        User user = userService.getById(setPayPasswordParam.getUserId());
+        if (user != null) {
+            if (user.getPayPassword() == null) {
+                return ServerResponseEntity.showFailMsg("支付密码还未设置,请先设置支付密码");
+            }
+
+            String ppw = encryptWithMD5(setPayPasswordParam.getPayPassword());
+            if (user.getPayPassword().equals(ppw)) {
+                return ServerResponseEntity.success("密码验证成功");
+            }
+        } else {
+            return ServerResponseEntity.showFailMsg("用户不存在");
+        }
+        return ServerResponseEntity.showFailMsg("支付密码错误");
+    }
+
+    @PostMapping("/transferAccounts")
+    @Operation(summary = "转账", description = "转账")
+    public ServerResponseEntity transferAccounts(@RequestBody CdnTransFerAccountParam cdnTransFerAccountParam) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime thirtyMinutesAgo = now.minusMinutes(1);
+        List<CdnFlow> cdnFlow = cdnFlowService.list(
+                Wrappers.<CdnFlow>lambdaQuery()
+                        .eq(CdnFlow::getUserId, cdnTransFerAccountParam.getUserId())
+                        .like(CdnFlow::getMemo, "转账")
+                        .eq(CdnFlow::getDelStatus, 0)
+                        .between(CdnFlow::getCreateTime, thirtyMinutesAgo, now));
+        if (!cdnFlow.isEmpty()){
+            return ServerResponseEntity.showFailMsg("1分钟内只能转账一次");
+        }
+        String wallet = cdnConfigService.selectValueByName("transferAccounts");
+        Double transferService = Double.parseDouble(cdnConfigService.selectValueByName("transferAccounts_service"));
+        if (wallet != null && !wallet.equals("")) {
+            boolean found = false;
+            String[] wallets = wallet.split(",");
+            for (String s :wallets){
+                if (s.equals(cdnTransFerAccountParam.getWalletId() + "")) {
+                    found = true;
+                    break;
+                }
+            }
+            if (!found){
+                return ServerResponseEntity.showFailMsg("该钱包不可转账!");
+            }
+        }
+        User u = userService.getUserByUserId(cdnTransFerAccountParam.getUserId());
+        if (u.getZhuanzhang() != 1) return ServerResponseEntity.showFailMsg("不可转账,请联系客服");
+        String ppw = encryptWithMD5(cdnTransFerAccountParam.getPayPassword());
+        User user = userService.getById(cdnTransFerAccountParam.getUserId());
+        if (user.getPayPassword() == null) {
+            return ServerResponseEntity.showFailMsg("请先设置支付密码");
+        }
+        if (!ppw.equals(user.getPayPassword())) {
+            return ServerResponseEntity.showFailMsg("支付密码错误");
+        }
+        CdnUserWallet cdnUserWallet = cdnUserWalletService.getOne(Wrappers.<CdnUserWallet>lambdaQuery()
+                .eq(CdnUserWallet::getUserId, cdnTransFerAccountParam.getUserId())
+                .eq(CdnUserWallet::getWalletId, cdnTransFerAccountParam.getWalletId()));
+        BigDecimal service = BigDecimal.valueOf(transferService);
+        if (cdnUserWallet != null) {
+            if (cdnUserWallet.getMoney().compareTo(cdnTransFerAccountParam.getAmount()) < 0) {
+                return ServerResponseEntity.showFailMsg("余额不足");
+            }
+            User payeeUser = userService.getOne(Wrappers.<User>lambdaQuery().eq(User::getUserMobile, cdnTransFerAccountParam.getMobile()));
+            if (payeeUser == null) {
+                return ServerResponseEntity.showFailMsg("收款人不存在");
+            }
+            if (payeeUser.getUserId().equals(cdnTransFerAccountParam.getUserId())) {
+                return ServerResponseEntity.showFailMsg("不能给自己转账");
+            }
+            //转账人
+            CdnTeamRelation cdnTeamRelations = cdnTeamRelationService.geteamRelationByUserId(cdnTransFerAccountParam.getUserId());
+            if(cdnTeamRelations != null){
+                if(cdnTeamRelations.getPids() != null && cdnTeamRelations.getPids().indexOf(payeeUser.getUserId()) > -1){// 转账人的上级 包含 收款人的用户Id
+                    // 执行转账逻辑
+                    Boolean b = cdnFlowService.executeTransferAccounts(cdnTransFerAccountParam.getUserId(), cdnTransFerAccountParam.getWalletId(), cdnTransFerAccountParam.getAmount(), payeeUser.getUserId());
+                    if (b) {
+                        return ServerResponseEntity.success();
+                    }
+                }else{
+                    //收款人
+                    CdnTeamRelation CdnTeamRelation = cdnTeamRelationService.geteamRelationByUserId(payeeUser.getUserId());
+                    if (CdnTeamRelation == null) {
+                        return ServerResponseEntity.showFailMsg("转账失败");
+                    }else {
+                        if(CdnTeamRelation.getPids() != null && CdnTeamRelation.getPids().indexOf(cdnTransFerAccountParam.getUserId()) > -1){// 收款人的上级 包含 转账人的用户Id
+                            // 执行转账逻辑
+                            Boolean b = cdnFlowService.executeTransferAccounts(cdnTransFerAccountParam.getUserId(), cdnTransFerAccountParam.getWalletId(), cdnTransFerAccountParam.getAmount(), payeeUser.getUserId());
+                            if (b) {
+                                return ServerResponseEntity.success();
+                            }
+                        }else {
+                            return ServerResponseEntity.showFailMsg("非上下级一条线的用户不能转账!");
+                        }
+                    }
+                }
+            }else{
+                return ServerResponseEntity.showFailMsg("转账失败!");
+            }
+        }
+        return ServerResponseEntity.showFailMsg("转账失败");
+    }
+
+    @PostMapping("/transfer")
+    @Operation(summary = "划转", description = "划转")
+    public ServerResponseEntity transfer(@RequestBody CdnTransFerParam cdnTransFerParam) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime thirtyMinutesAgo = now.minusMinutes(1);
+        List<CdnFlow> cdnFlow = cdnFlowService.list(
+                Wrappers.<CdnFlow>lambdaQuery()
+                        .eq(CdnFlow::getUserId, cdnTransFerParam.getUserId())
+                        .like(CdnFlow::getMemo, "划转")
+                        .eq(CdnFlow::getDelStatus, 0)
+                        .between(CdnFlow::getCreateTime, thirtyMinutesAgo, now));
+        if (!cdnFlow.isEmpty()){
+            return ServerResponseEntity.showFailMsg("1分钟内只能划转一次");
+        }
+        User u = userService.getUserByUserId(cdnTransFerParam.getUserId());
+        if (u.getHuazhuan() != 1) return ServerResponseEntity.showFailMsg("不可划转,请联系客服");
+        String ppw = encryptWithMD5(cdnTransFerParam.getPayPassword());
+        User user = userService.getById(cdnTransFerParam.getUserId());
+        if (user.getPayPassword() == null) {
+            return ServerResponseEntity.showFailMsg("请先设置支付密码");
+        }
+        if (!ppw.equals(user.getPayPassword())) {
+            return ServerResponseEntity.showFailMsg("支付密码错误");
+        }
+        CdnUserWallet cdnUserWallet = cdnUserWalletService.getOne(Wrappers.<CdnUserWallet>lambdaQuery()
+                .eq(CdnUserWallet::getUserId, cdnTransFerParam.getUserId())
+                .eq(CdnUserWallet::getWalletId, cdnTransFerParam.getWalletId()));
+        if (cdnUserWallet != null) {
+            if (cdnUserWallet.getMoney().compareTo(cdnTransFerParam.getAmount()) < 0) {
+                return ServerResponseEntity.showFailMsg("余额不足");
+            }
+            // 执行划转逻辑
+            Boolean b = cdnFlowService.executeTransfer(cdnTransFerParam.getUserId(), cdnTransFerParam.getWalletId(), cdnTransFerParam.getAmount(), cdnTransFerParam.getTransFerWalletId());
+            if (b) {
+                return ServerResponseEntity.success();
+            }
+        }
+        return ServerResponseEntity.showFailMsg("划转失败");
+    }
+
+
+    @PostMapping("/cash")
+    @Operation(summary = "兑现幸运池", description = "兑现幸运池")
+    public ServerResponseEntity cash(@RequestBody CdnTransFerParam cdnTransFerParam) {
+        if(StringUtils.isBlank(cdnTransFerParam.getUserId())){
+            return ServerResponseEntity.showFailMsg("用户Id不能为空!");
+        }
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime thirtyMinutesAgo = now.minusMinutes(1);
+        List<CdnFlow> cdnFlow = cdnFlowService.list(
+                Wrappers.<CdnFlow>lambdaQuery()
+                        .eq(CdnFlow::getUserId, cdnTransFerParam.getUserId())
+                        .like(CdnFlow::getMemo, "兑换")
+                        .eq(CdnFlow::getDelStatus, 0)
+                        .between(CdnFlow::getCreateTime, thirtyMinutesAgo, now));
+        if (!cdnFlow.isEmpty()){
+            return ServerResponseEntity.showFailMsg("1分钟内只能兑换一次");
+        }
+        User u = userService.getUserByUserId(cdnTransFerParam.getUserId());
+        if (u.getHuazhuan() != 1) return ServerResponseEntity.showFailMsg("不可兑换,请联系客服");
+        String ppw = encryptWithMD5(cdnTransFerParam.getPayPassword());
+        User user = userService.getById(cdnTransFerParam.getUserId());
+        if (user.getPayPassword() == null) {
+            return ServerResponseEntity.showFailMsg("请先设置支付密码");
+        }
+        if (!ppw.equals(user.getPayPassword())) {
+            return ServerResponseEntity.showFailMsg("支付密码错误");
+        }
+        CdnUserWallet cdnUserWallet = cdnUserWalletService.getOne(Wrappers.<CdnUserWallet>lambdaQuery()
+                .eq(CdnUserWallet::getUserId, cdnTransFerParam.getUserId())
+                .eq(CdnUserWallet::getWalletId, cdnTransFerParam.getWalletId()));
+        if (cdnUserWallet != null) {
+            if (cdnUserWallet.getMoney().compareTo(cdnTransFerParam.getAmount()) < 0) {
+                return ServerResponseEntity.showFailMsg("金牛豆不足");
+            }
+            // 执行兑换逻辑
+            cdnTransFerParam.setTransFerWalletId(WalletEnum.LUCKPOOL.value());
+            String msg = cdnFlowService.cash(cdnTransFerParam.getUserId(), cdnTransFerParam.getWalletId(), cdnTransFerParam.getAmount(), cdnTransFerParam.getTransFerWalletId());
+            if(ResponseEnum.OK.getMsg().equals(msg)){
+                return ServerResponseEntity.success(ResponseEnum.OK.getMsg());
+            }else {
+                return ServerResponseEntity.showFailMsg(msg);
+            }
+        }
+        return ServerResponseEntity.showFailMsg("兑换失败");
+    }
+
+    @GetMapping("/getRechargeQrCode")
+    @Operation(summary = "获取充值二维码", description = "获取充值二维码")
+    public ServerResponseEntity<RechargeParam> getRechargeQrCode() {
+        RechargeParam rechargeParam = new RechargeParam();
+        Object rechargeimg = cdnConfigService.selectValueByName("rechargeimg");
+        HuaWeiOss aliOss = sysConfigService.getSysConfigObject(Constant.HUAWEI_OBS_CONFIG, HuaWeiOss.class);
+        if (aliOss != null) {
+            String bucketName = aliOss.getBucketName();//shjw2024
+            String endpoint = aliOss.getEndpoint(); //https://oss-cn-shanghai.aliyuncs.com
+            String pre = endpoint.substring(0, 8);
+            String fix = endpoint.substring(8);
+            String path = pre + bucketName + "." + fix;
+            String img = rechargeimg.toString();
+            rechargeParam.setImg(path + "/" + img);
+        }
+        String moneyArr = cdnConfigService.selectValueByName("money_arr");
+        Gson gson = new Gson();
+        Type type = new TypeToken<Map<String, String>>(){}.getType();
+
+        try {
+            Map<String, String> map = gson.fromJson(moneyArr, type);
+            List<String> moneyList = new ArrayList<>(map.values());
+            rechargeParam.setMoneyArr(moneyList);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        String rechageHour = cdnConfigService.selectValueByName("rechage_hour");
+        rechargeParam.setRechageHour(rechageHour);
+        return ServerResponseEntity.success(rechargeParam);
+    }
+
+    @PostMapping("/recharge")
+    @Operation(summary = "充值", description = "充值")
+    public ServerResponseEntity recharge(@RequestBody CdnUserRecharge cdnUserRecharge) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime thirtyMinutesAgo = now.minusMinutes(1);
+        CdnUserRecharge cdnUserRecharge1 = cdnUserRechargeService.getOne(
+                Wrappers.<CdnUserRecharge>lambdaQuery()
+                        .eq(CdnUserRecharge::getUserId, cdnUserRecharge.getUserId())
+                        .eq(CdnUserRecharge::getStatus, 0)
+                        .between(CdnUserRecharge::getCreateTime, thirtyMinutesAgo, now));
+        if (cdnUserRecharge1 != null){
+            return ServerResponseEntity.showFailMsg("1分钟内只能充值一次");
+        }
+        String rechageHour = cdnConfigService.selectValueByName("rechage_hour");
+        // 获取今天的日期
+        LocalDateTime today = LocalDateTime.now();
+        Integer hour = today.getHour();
+        String[] parts = rechageHour.split("-"); // 使用 - 分割字符串
+        String startHour = parts[0]; // 截取起始小时
+        String endHour = parts[1]; // 截取结束小时
+        if (hour <= Integer.parseInt(startHour) || hour > Integer.parseInt(endHour)) {
+            return ServerResponseEntity.showFailMsg("充值时间限制" + rechageHour);
+        }
+//        String moneyArr = cdnConfigService.selectValueByName("money_arr"); //{"0":"2000","1":"6000","2":"15000","3":"150000"}
+//        Gson gson = new Gson();
+//        Type type = new TypeToken<Map<String, String>>(){}.getType();
+//        try {
+//            Map<String, String> map = gson.fromJson(moneyArr, type);
+//            List<String> moneyList = new ArrayList<>(map.values());
+//            if (!moneyList.contains(cdnUserRecharge.getMoney().toString())) {
+//                return ServerResponseEntity.showFailMsg("充值金额错误");
+//            }
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        }
+
+        cdnUserRecharge.setCreateTime(new Date());
+        cdnUserRechargeService.save(cdnUserRecharge);
+        return ServerResponseEntity.success();
+    }
+    @GetMapping("/getUserBank")
+    @Operation(summary = "获取银行卡列表", description = "获取银行卡列表")
+    public ServerResponseEntity<List<CdnUserBank>> getUserBank(@RequestParam("userId") String userId) {
+        return ServerResponseEntity.success(cdnUserBankService.list(Wrappers.<CdnUserBank>lambdaQuery().eq(CdnUserBank::getUserId, userId)));
+    }
+
+    @PostMapping("/deleteUserBank")
+    @Operation(summary = "删除用户银行卡信息", description = "删除用户银行卡信息")
+    public ServerResponseEntity<String> deleteUserBank(@RequestBody CdnUserBank bank) {
+        Integer num = cdnUserBankService.deleteUserBank(bank);
+        if(num > 0){
+            return ServerResponseEntity.success();
+        }
+        return ServerResponseEntity.showFailMsg(I18nMessage.getMessage("删除银行卡信息失败!"));
+    }
+
+    @PostMapping("/updateUserBank")
+    @Operation(summary = "修改用户银行卡信息", description = "修改用户银行卡信息")
+    public ServerResponseEntity<String> updateUserBank(@RequestBody CdnUserBank bank) {
+        Boolean flag =  cdnUserBankService.updateById(bank);
+        if(flag){
+            return ServerResponseEntity.success();
+        }
+        return ServerResponseEntity.showFailMsg(I18nMessage.getMessage("修改银行卡信息失败!"));
+    }
+
+    @PostMapping("/withdrawal")
+    @Operation(summary = "提现", description = "提现")
+    @Transactional(rollbackFor = Exception.class)
+    public ServerResponseEntity withdrawal(@RequestBody CdnWithdrawal cdnWithdrawal) {
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime thirtyMinutesAgo = now.minusMinutes(1);
+        CdnWithdrawal cdnWithdrawal1 = cdnWithdrawalService.getOne(
+                Wrappers.<CdnWithdrawal>lambdaQuery()
+                        .eq(CdnWithdrawal::getUserId, cdnWithdrawal.getUserId())
+                        .eq(CdnWithdrawal::getStatus, 0)
+                        .between(CdnWithdrawal::getCreateTime, thirtyMinutesAgo, now));
+        if (cdnWithdrawal1 != null){
+            return ServerResponseEntity.showFailMsg("1分钟内只能提现一次");
+        }
+        return cdnWithdrawalService.executeWithdrawal(cdnWithdrawal);
+    }
+
+    @GetMapping("/getWithdrawal")
+    @Operation(summary = "获取提现配置", description = "获取提现配置")
+    public ServerResponseEntity<CdnWithdrawalConfigParam> getUserWithdrawal() {
+        CdnWithdrawalConfigParam cdnWithdrawalConfigParam = new CdnWithdrawalConfigParam();
+        cdnWithdrawalConfigParam.setWithdrawalService(cdnConfigService.selectValueByName("withdrawal_service"));
+        cdnWithdrawalConfigParam.setWithdrawalThreshold(cdnConfigService.selectValueByName("withdrawal_threshold"));
+        cdnWithdrawalConfigParam.setWithdrawalTitle(cdnConfigService.selectValueByName("withdrawal_title"));
+        cdnWithdrawalConfigParam.setWithdrawDay(cdnConfigService.selectValueByName("withdraw_day"));
+        // 获取今天的日期
+        LocalDateTime today = LocalDateTime.now();
+        // 获取今天是周几
+        Integer dayOfWeek = today.getDayOfMonth();
+        if (!dayOfWeek.equals(Integer.parseInt(cdnWithdrawalConfigParam.getWithdrawDay()))) {
+            cdnWithdrawalConfigParam.setIsDraw(false);
+        }else{
+            cdnWithdrawalConfigParam.setIsDraw(true);
+        }
+        cdnWithdrawalConfigParam.setWithdrawalDay(cdnConfigService.selectValueByName("withdrawal_day"));
+        cdnWithdrawalConfigParam.setWithdrawHour(cdnConfigService.selectValueByName("withdraw_hour"));
+        cdnWithdrawalConfigParam.setWithdrawalBluePointPoundage(cdnConfigService.selectValueByName("withdrawal_bluePoint_poundage"));
+        return ServerResponseEntity.success(cdnWithdrawalConfigParam);
+    }
+
+    @GetMapping("/getConvertConfig")
+    @Operation(summary = "获取划转配置", description = "获取划转配置")
+    public ServerResponseEntity<CdnConvertConfigParam> getConvertConfig() {
+        CdnConvertConfigParam cdnConvertConfigParam = new CdnConvertConfigParam();
+        String convert = cdnConfigService.selectValueByName("convert");
+        if(!StringUtils.isEmpty(convert)){
+            String[] converts = convert.split(",");
+            Map<String,String> convertMap = new HashMap<>();
+            for (String c : converts){
+                CdnWallet cw = cdnWalletService.getOne(Wrappers.lambdaQuery(CdnWallet.class).eq(CdnWallet::getId, Integer.parseInt(c)));
+                convertMap.put(c,cw.getName());
+            }
+            cdnConvertConfigParam.setConvert(convertMap);
+        }
+        String convertReceive = cdnConfigService.selectValueByName("convert_receive");
+        String[] convertReceives = convertReceive.split(",");
+        Map<String,String> convertReceiveMap = new HashMap<>();
+        for (String c : convertReceives){
+            CdnWallet cw = cdnWalletService.getOne(Wrappers.lambdaQuery(CdnWallet.class).eq(CdnWallet::getId, Integer.parseInt(c)));
+            convertReceiveMap.put(c,cw.getName());
+        }
+        cdnConvertConfigParam.setConvertReceive(convertReceiveMap);
+        String convertPoundage = cdnConfigService.selectValueByName("convert_poundage");
+        cdnConvertConfigParam.setConvertPoundage(convertPoundage);
+        String transferReceive = cdnConfigService.selectValueByName("transferAccounts");
+        String[] transfer = transferReceive.split(",");
+        Map<String,String> transferMap = new HashMap<>();
+        for (String c : transfer){
+            CdnWallet cw = cdnWalletService.getOne(Wrappers.lambdaQuery(CdnWallet.class).eq(CdnWallet::getId, Integer.parseInt(c)));
+            transferMap.put(c,cw.getName());
+        }
+        cdnConvertConfigParam.setTransferList(transferMap);
+
+        String transferService = cdnConfigService.selectValueByName("transferAccounts_service");
+        cdnConvertConfigParam.setTransferPoundage(transferService);
+        return ServerResponseEntity.success(cdnConvertConfigParam);
+    }
+
+
+    @GetMapping("/getWalletLog")
+    @Operation(summary = "获取用户提现记录", description = "获取用户提现记录")
+    public ServerResponseEntity<List<CdnWithdrawal>> getUserWalletLog(@RequestParam String userId) {
+        List<CdnWithdrawal> cdnWithdrawalList = cdnWithdrawalService.list(Wrappers.lambdaQuery(CdnWithdrawal.class)
+                .eq(CdnWithdrawal::getUserId, userId)
+                .orderByDesc(CdnWithdrawal::getCreateTime));
+        return ServerResponseEntity.success(cdnWithdrawalList);
+    }
+
+    @GetMapping("/getWalletLogPage")
+    @Operation(summary = "分页获取用户提现记录", description = "获取用户提现记录")
+    public ServerResponseEntity<IPage<CdnWithdrawal>> getUserWalletLog(@RequestParam Integer page,@RequestParam Integer pageSize,@RequestParam String userId) {
+        PageParam<CdnWithdrawal> param = new PageParam<>();
+        param.setCurrent(page);
+        param.setSize(pageSize);
+        LambdaQueryWrapper<CdnWithdrawal> wrapper = new LambdaQueryWrapper<>(CdnWithdrawal.class);
+        wrapper.orderByDesc(CdnWithdrawal::getCreateTime);
+        wrapper.eq(CdnWithdrawal::getUserId, userId);
+        PageParam<CdnWithdrawal> page1 = cdnWithdrawalService.page(param, wrapper);
+        if (!page1.getRecords().isEmpty()) {
+            for (CdnWithdrawal cdnWithdrawal1 : page1.getRecords()) {
+                CdnUserWallet info = userService.getInfo(cdnWithdrawal1.getUserId(), cdnWithdrawal1.getWalletId());
+                if (info != null) {
+                    cdnWithdrawal1.setNickName(info.getNickName());
+                    cdnWithdrawal1.setMobile(info.getMobile());
+                    cdnWithdrawal1.setWalletName(info.getWalletName());
+                }
+                CdnUserBank cdnUserBank = cdnUserBankService.getById(cdnWithdrawal1.getUserBankId());
+                if (cdnUserBank != null) {
+                    cdnWithdrawal1.setBankCode(cdnUserBank.getBankcode());
+                    cdnWithdrawal1.setBank(cdnUserBank.getBank());
+                    cdnWithdrawal1.setType(cdnUserBank.getType());
+                    cdnWithdrawal1.setRealName(cdnUserBank.getName());
+                }
+            }
+        }
+        return ServerResponseEntity.success(page1);
+    }
+
+    @GetMapping("/getUserStatus")
+    @Operation(summary = "获取用户 提现/划转/转账 状态", description = "获取用户 提现/划转/转账 状态")
+    public ServerResponseEntity<User> getUserStatus(@RequestParam String userId) {
+        return ServerResponseEntity.success(userService.getById(userId));
+    }
+
+    @GetMapping("/getBankConfig")
+    @Operation(summary = "获取银行卡配置", description = "获取银行卡配置")
+    public ServerResponseEntity<CdnBankConfigParam> getUserConfigBank() {
+        String bankName = cdnConfigService.selectValueByName("bank_name");
+        String bankCode = cdnConfigService.selectValueByName("bank_code");
+        String companyName = cdnConfigService.selectValueByName("company_name");
+        CdnBankConfigParam cdnBankConfigParam = new CdnBankConfigParam(bankName, bankCode, companyName);
+        return ServerResponseEntity.success(cdnBankConfigParam);
+    }
+
+    @GetMapping("/getRechargeLog")
+    @Operation(summary = "获取用户充值记录", description = "获取用户充值记录")
+    public ServerResponseEntity<List<CdnUserRecharge>> getUserRechargeLog(@RequestParam String userId) {
+        List<CdnUserRecharge> cdnUserRechargeList = cdnUserRechargeService.list(Wrappers.lambdaQuery(CdnUserRecharge.class)
+                .eq(CdnUserRecharge::getUserId, userId).orderByDesc(CdnUserRecharge::getCreateTime));
+        return ServerResponseEntity.success(cdnUserRechargeList);
+    }
+
+    /**
+     * 验证支付密码是否为纯数字。
+     *
+     * @param payPassword 待验证的支付密码字符串
+     * @return 如果支付密码为纯数字则返回true,否则返回false
+     */
+    public static boolean isNumericPayPassword(String payPassword) {
+        return NUMERIC_PATTERN.matcher(payPassword).matches();
+    }
+
+    // 支付密码加密
+    public static String encryptWithMD5(String password) {
+        try {
+            // 创建一个MD5的消息摘要对象
+            MessageDigest md = MessageDigest.getInstance("MD5");
+
+            // 将密码转换为字节数组并进行MD5摘要
+            byte[] messageDigest = md.digest(password.getBytes());
+
+            // 将摘要转换为16进制字符串
+            BigInteger no = new BigInteger(1, messageDigest);
+            String hashtext = no.toString(16);
+
+            // 补齐长度到32位
+            while (hashtext.length() < 32) {
+                hashtext = "0" + hashtext;
+            }
+
+            return hashtext;
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException("MD5 hashing algorithm not found", e);
+        }
+    }
+}

--
Gitblit v1.9.3