本模块提供账户余额查询功能,包括账户总余额和可提现金额的查询,支持完整的账户资金状态展示。
GET /incomeManage/getAccountBalance@LoginRequired 注解)| 参数名 | 类型 | 必填 | 说明 | 示例值 |
|---|---|---|---|---|
| storeId | Integer | 是 | 门店ID | 103 |
GET /incomeManage/getAccountBalance?storeId=103
curl "http://localhost:8080/incomeManage/getAccountBalance?storeId=103" \
-H "Authorization: Bearer YOUR_TOKEN"
{
"code": 200,
"success": true,
"data": {
"balance": "1234.56",
"cashOutMoney": "567.89"
},
"msg": "操作成功"
}
| 字段名 | 类型 | 说明 |
|---|---|---|
| data.balance | String | 账户总余额(单位:元) |
| data.cashOutMoney | String | 可提现金额(单位:元) |
字段详细说明:
store_user 表的 money 字段计算规则:
可提现金额 = 4~27天内收入 - (已提现金额 + 待审核金额)
时间范围: 收入创建时间在 [当前时间-27天, 当前时间-4天] 之间
条件: 未绑定提现记录(cash_out_id 为空)
扣除项:
payment_status = 3)payment_status = 1)单位: 元(已从分转换)
精度: 保留2位小数
{
"code": 500,
"success": false,
"data": null,
"msg": "查询失败:店铺用户不存在"
}
{
"code": 500,
"success": false,
"data": null,
"msg": "请先登录"
}
{
"code": 500,
"success": false,
"data": null,
"msg": "查询失败:{异常信息}"
}
┌─────────────────────────────────────────────┐
│ 1. 接收门店ID参数 │
│ storeId │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 2. 查询店铺用户信息 │
│ 根据 storeId 查询 store_user 表 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 3. 获取账户总余额 │
│ balance = money ÷ 100 │
│ (分→元,保留2位小数) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 4. 查询4~27天内的收入记录 │
│ 条件: │
│ - created_time BETWEEN (now-27天, now-4天) │
│ - cash_out_id IS NULL │
│ - store_id = ? │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 5. 计算4~27天内收入总额 │
│ sum(money) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 6. 查询已提现和待审核记录 │
│ 条件: │
│ - store_id = ? │
│ - payment_status IN (1, 3) │
│ - delete_flag = 0 │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 7. 计算已提现+待审核总额 │
│ sum(money) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 8. 计算可提现金额 │
│ cashOutMoney = 收入总额 - 提现总额 │
│ 转换为元(保留2位小数) │
└─────────────────┬───────────────────────────┘
↓
┌─────────────────────────────────────────────┐
│ 9. 返回结果 │
│ { balance, cashOutMoney } │
└─────────────────────────────────────────────┘
当前时间: 2025-11-17
可提现收入时间范围: 2025-10-21 ~ 2025-11-13
计算公式:
- 开始时间 = 当前时间 - 27天
- 结束时间 = 当前时间 - 4天
为什么是4~27天?
场景1: 正常情况
4~27天内收入总额: 100000分(1000元)
已提现金额: 0分
待审核金额: 0分
可提现金额 = (100000 - 0) ÷ 100 = 1000.00元
场景2: 有待审核提现
4~27天内收入总额: 100000分(1000元)
已提现金额: 0分
待审核金额: 50000分(500元)
可提现金额 = (100000 - 50000) ÷ 100 = 500.00元
场景3: 有已提现记录
4~27天内收入总额: 100000分(1000元)
已提现金额: 30000分(300元)
待审核金额: 20000分(200元)
可提现金额 = (100000 - 30000 - 20000) ÷ 100 = 500.00元
场景4: 收入不足或已全部提现
4~27天内收入总额: 50000分(500元)
已提现金额: 50000分(500元)
待审核金额: 0分
可提现金额 = (50000 - 50000) ÷ 100 = 0.00元
查询SQL:
SELECT * FROM store_user
WHERE store_id = ?
说明:
money 字段)查询SQL:
SELECT * FROM store_income_details_record
WHERE store_id = ?
AND created_time BETWEEN ? AND ? -- 4~27天
AND cash_out_id IS NULL
AND delete_flag = 0
说明:
cash_out_id IS NULL: 未绑定提现记录查询SQL:
SELECT * FROM store_cash_out_record
WHERE store_id = ?
AND payment_status IN ('1', '3')
AND delete_flag = '0'
说明:
payment_status = 1: 待审核payment_status = 3: 已提现| Status | 说明 | 是否扣除 |
|---|---|---|
| 0 | 审核不通过 | ❌ 不扣除 |
| 1 | 待审核 | ✅ 扣除 |
| 2 | 审核通过待打款 | ❌ 不扣除 |
| 3 | 已提现(已打款) | ✅ 扣除 |
扣除规则说明:
| 数据库存储(分) | 显示(元) | 转换公式 |
|---|---|---|
| 100000 | 1000.00 | money ÷ 100 |
| 56789 | 567.89 | money ÷ 100 |
| 0 | 0.00 | money ÷ 100 |
// 账户总余额转换
String balance = new BigDecimal(storeUser.getMoney())
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP)
.toString();
// 可提现金额转换
BigDecimal finalCashOutMoney = new BigDecimal(cashOutMoney)
.subtract(BigDecimal.valueOf(totalCashOutAmount))
.divide(new BigDecimal(100), 2, RoundingMode.HALF_UP);
转换规则:
BigDecimal 进行精确计算HALF_UP(四舍五入)数据状态:
响应:
{
"code": 200,
"success": true,
"data": {
"balance": "0.00",
"cashOutMoney": "0.00"
}
}
数据状态:
响应:
{
"code": 200,
"success": true,
"data": {
"balance": "500.00",
"cashOutMoney": "0.00"
}
}
说明: 账户有余额,但都是4天内的收入,还未到可提现期
数据状态:
响应:
{
"code": 200,
"success": true,
"data": {
"balance": "1500.00",
"cashOutMoney": "1000.00"
}
}
说明: 账户余额1500元,其中1000元可提现
数据状态:
响应:
{
"code": 200,
"success": true,
"data": {
"balance": "1500.00",
"cashOutMoney": "400.00"
}
}
说明:
数据状态:
响应:
{
"code": 200,
"success": true,
"data": {
"balance": "500.00",
"cashOutMoney": "0.00"
}
}
说明:
接口使用 @LoginRequired 注解进行登录验证,通过AOP切面实现:
storePlatform| 场景 | 返回消息 |
|---|---|
| Token无效或不存在 | "请先登录" |
| 用户类型不正确 | "请先登录" |
| Token已过期或已注销 | "请先登录" |
| 异常情况 | HTTP状态码 | 返回code | 返回msg |
|---|---|---|---|
| 店铺用户不存在 | 200 | 500 | "查询失败:店铺用户不存在" |
| 未登录 | 200 | 500 | "请先登录" |
| 系统异常 | 200 | 500 | "查询失败:{异常信息}" |
所有请求和异常都会记录详细日志:
// 请求日志
log.info("IncomeManageController.getAccountBalance?storeId={}", storeId);
// 业务日志
log.debug("IncomeManageServiceImpl.getAccountBalance - 账户总余额: {}元", balance);
log.debug("IncomeManageServiceImpl.getAccountBalance - 4~27天内收入总额: {}分", cashOutMoney);
// 异常日志
log.error("IncomeManageController.getAccountBalance ERROR: {}", e.getMessage(), e);
请求:
GET /incomeManage/getAccountBalance?storeId=103
预期结果:
前置条件:
预期结果:
{
"balance": "0.00",
"cashOutMoney": "0.00"
}
前置条件:
预期结果:
cashOutMoney 应扣除待审核金额balance 不受影响请求:
GET /incomeManage/getAccountBalance?storeId=999999
预期结果:
{
"code": 500,
"success": false,
"msg": "查询失败:店铺用户不存在"
}
balance(账户总余额): 来自 store_user.moneycashOutMoney(可提现金额): 计算得出,受多个因素影响balance >= cashOutMoney(总是成立)storePlatform确保以下字段有索引:
-- store_user表
ALTER TABLE store_user ADD INDEX idx_store_id (store_id);
-- store_income_details_record表
ALTER TABLE store_income_details_record
ADD INDEX idx_store_created_cashout (store_id, created_time, cash_out_id);
-- store_cash_out_record表
ALTER TABLE store_cash_out_record
ADD INDEX idx_store_status (store_id, payment_status, delete_flag);
BETWEEN对于频繁查询的数据,可以考虑:
alien-store/alienStore/storeIncomeDetailsRecord/accountBalanceStoreIncomeDetailsRecordControllerStoreIncomeDetailsRecordService.accountBalance()alien-store-platform/incomeManage/getAccountBalanceIncomeManageControllerIncomeManageService.getAccountBalance()| 项目 | app端 | web端 | 说明 |
|---|---|---|---|
| 接口路径 | /accountBalance |
/getAccountBalance |
更符合web端命名规范 |
| 登录验证 | 无 | ✅ 有(@LoginRequired) | 增加登录验证 |
| 返回类型 | Map | Map | 保持一致 |
| 业务逻辑 | ✅ | ✅ | 完全复用 |
| 日志记录 | 基础 | 详细 | 增强日志记录 |