From 6912e074af61b73307d2fc31b1b8f4974f5eb4f3 Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期五, 22 五月 2026 10:17:31 +0800
Subject: [PATCH] Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/mx_charging_pile

---
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java |   64 +++++++++++++++++++++++++++++++-
 1 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
index d534d39..bcb5e3a 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -44,9 +44,13 @@
 import com.ruoyi.other.api.domain.*;
 import com.ruoyi.other.api.domain.TCoupon;
 import com.ruoyi.other.api.domain.TVip;
+import com.ruoyi.other.api.dto.ExchangeCodeBindDTO;
+import com.ruoyi.other.api.dto.ExchangeCodeUseRecordQuery;
 import com.ruoyi.other.api.dto.UnitListQueryDto;
 import com.ruoyi.other.api.feignClient.IntegralRuleClient;
 import com.ruoyi.other.api.feignClient.OtherClient;
+import com.ruoyi.other.api.vo.ExchangeCodeBindResultVO;
+import com.ruoyi.other.api.domain.TExchangeCodeUseRecord;
 import com.ruoyi.other.api.feignClient.VipClient;
 import com.ruoyi.system.api.model.LoginUser;
 import com.ruoyi.system.api.model.LoginUserApplet;
@@ -368,12 +372,18 @@
         if (page.getRecords().isEmpty()){
             return R.ok(page);
         }
+        List<Long> pageUserIds = page.getRecords().stream().map(TAppUser::getId).collect(Collectors.toList());
+        Map<Long, BigDecimal> exchangeCodeBalanceMap = otherClient.getExchangeCodeBalanceMap(pageUserIds).getData();
+        if (exchangeCodeBalanceMap == null) {
+            exchangeCodeBalanceMap = new HashMap<>();
+        }
         List<Integer> vipIds = new ArrayList<>();
 //              vipIds     = page.getRecords().stream().map(TAppUser::getVipId).collect(Collectors.toList());
         //获取会员map
         R<Map<Integer, String>> vipMap = otherClient.getVipMap(vipIds);
         //循环处理
         for (TAppUser appUser : page.getRecords()) {
+            appUser.setExchangeCodeBalance(exchangeCodeBalanceMap.getOrDefault(appUser.getId(), BigDecimal.ZERO));
             //拿到最新的tagId
             TAppUserTag one = appUserTagService.lambdaQuery().eq(TAppUserTag::getAppUserId, appUser.getId()).orderByDesc(TAppUserTag::getCreateTime).last("limit 1").one();
             if (one!=null) {
@@ -721,7 +731,53 @@
         }
         
         return R.ok(page);
-        
+
+    }
+
+    @RequiresPermissions(value = {"/appUser/select", "/vipList/select"}, logical = Logical.OR)
+    @ApiOperation(value = "用户详情余额明细", tags = {"后台-用户管理-用户列表"})
+    @PostMapping(value = "/user/balance/page")
+    public R<Page<TExchangeCodeUseRecord>> adminBalanceDetail(@RequestBody ExchangeCodeUseRecordQuery queryDto) {
+        return otherClient.exchangeCodeUseRecordPage(queryDto);
+    }
+
+    @ApiOperation(value = "余额明细", tags = {"小程序-个人中心"})
+    @PostMapping(value = "/user/balance/page1")
+    public R<Page<TExchangeCodeUseRecord>> balanceDetail(@RequestBody ExchangeCodeUseRecordQuery queryDto) {
+        if (queryDto.getUserId() == null) {
+            queryDto.setUserId(tokenService.getLoginUserApplet().getUserId());
+        }
+        return otherClient.exchangeCodeUseRecordPage(queryDto);
+    }
+
+    @ApiOperation(value = "余额明细详情", tags = {"小程序-个人中心"})
+    @GetMapping(value = "/user/balance/detail")
+    public R<TExchangeCodeUseRecord> balanceDetail(@RequestParam("id") Long id) {
+        Long userId = tokenService.getLoginUserApplet().getUserId();
+        return otherClient.exchangeCodeUseRecordDetail(id, userId);
+    }
+
+    @ApiOperation(value = "兑换余额", tags = {"小程序-个人中心"})
+    @PostMapping(value = "/user/balance/exchange")
+    public R<BigDecimal> exchangeBalance(@RequestBody ExchangeCodeBindDTO dto) {
+        LoginUserApplet loginUser = tokenService.getLoginUserApplet();
+        TAppUser appUser = appUserService.getById(loginUser.getUserId());
+        R<ExchangeCodeBindResultVO> bindResult = otherClient.bindExchangeCode(dto, appUser.getId(), appUser.getPhone());
+        if (bindResult.getData() == null) {
+            return R.fail(bindResult.getMsg());
+        }
+        Map<Long, BigDecimal> balanceMap = otherClient.getExchangeCodeBalanceMap(Collections.singletonList(appUser.getId())).getData();
+        BigDecimal totalExchangeBalance = balanceMap == null ? BigDecimal.ZERO : balanceMap.getOrDefault(appUser.getId(), BigDecimal.ZERO);
+        BigDecimal oldBalance = defaultBalance(appUser.getBalance());
+        BigDecimal exchangeAmount = totalExchangeBalance.subtract(oldBalance);
+        if (exchangeAmount.compareTo(BigDecimal.ZERO) <= 0) {
+            return R.fail("兑换金额异常");
+        }
+        BigDecimal newBalance = oldBalance.add(exchangeAmount);
+        appUser.setBalance(newBalance);
+        appUserService.updateById(appUser);
+
+        return R.ok(exchangeAmount);
     }
     
     @ApiOperation(value = "积分详情", tags = {"小程序-个人中心"})
@@ -825,6 +881,7 @@
         appUserInfoDto.setUserCars(list);
         appUserInfoDto.setFirstAdd(byId.getFirstAdd()!=null?byId.getFirstAdd():0);
         appUserInfoDto.setPoints(byId.getPoints()==null?0:byId.getPoints());
+        appUserInfoDto.setBalance(byId.getBalance()==null?BigDecimal.ZERO:byId.getBalance());
         return R.ok(appUserInfoDto);
     }
     
@@ -1473,6 +1530,9 @@
         }
         return R.ok();
     }
+
+    private BigDecimal defaultBalance(BigDecimal balance) {
+        return balance == null ? BigDecimal.ZERO : balance;
+    }
     
 }
-

--
Gitblit v1.7.1