# 获取店铺今日收益接口文档 ## 概述 本文档描述了从 `alien-store`(app端商户)迁移到 `alien-store-platform`(web端商户)的获取店铺今日收益接口。 ## 接口详情 ### 获取店铺今日收益 **接口描述**:查询指定店铺在当天(00:00:00 至 23:59:59)的总收益,包括所有收入类型(代金券、团购等),返回格式化后的金额(单位:元)。 #### 原接口 - **服务**:alien-store(app端商户) - **路径**:`GET /alienStore/storeIncomeDetailsRecord/todayIncome?storeId=102` - **Controller**:`StoreIncomeDetailsRecordController.todayIncome()` - **Service**:`StoreIncomeDetailsRecordServiceImpl.todayIncome()` #### 新接口 - **服务**:alien-store-platform(web端商户) - **路径**:`GET /alienStorePlatform/storeManage/getTodayIncome?storeId=102` - **Controller**:`StoreManageController.getTodayIncome()` - **Service**:`StoreManageServiceImpl.getTodayIncome()` #### 请求参数 **Query 参数**: | 参数名 | 类型 | 必填 | 说明 | |--------|------|------|------| | storeId | Integer | 是 | 店铺ID | **请求示例**: ``` GET /alienStorePlatform/storeManage/getTodayIncome?storeId=102 ``` #### 响应参数 **成功响应**: ```json { "code": 200, "msg": "查询成功", "data": "1234.56", "success": true } ``` **说明**: - `data` 字段为字符串类型 - 单位:元(人民币) - 格式:保留两位小数 - 示例值: - `"0.00"` - 今日无收益 - `"123.45"` - 今日收益123.45元 - `"10000.00"` - 今日收益10000元 **失败响应**: ```json { "code": 500, "msg": "{错误信息}", "data": null, "success": false } ``` #### 业务逻辑 ##### 1. 查询今日收入记录 ```java LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); LocalDate today = LocalDate.now(); wrapper.eq(StoreIncomeDetailsRecord::getStoreId, storeId) .ge(StoreIncomeDetailsRecord::getCreatedTime, today + " 00:00:00") .le(StoreIncomeDetailsRecord::getCreatedTime, today + " 23:59:59"); List incomeList = storeIncomeDetailsRecordMapper.selectList(wrapper); ``` **查询条件**: - **storeId**:店铺ID精确匹配 - **createdTime**: - 大于等于(>=):今日 00:00:00 - 小于等于(<=):今日 23:59:59 - **deleteFlag**:自动过滤已删除记录(MyBatis-Plus逻辑删除) **时间范围说明**: - 以数据库服务器时间为准 - 包含今日的所有时刻(00:00:00 - 23:59:59) - 跨天的收入记录按 `createdTime` 归属日期 ##### 2. 计算总收益 ```java int totalIncome = 0; if (incomeList != null && !incomeList.isEmpty()) { totalIncome = incomeList.stream() .mapToInt(StoreIncomeDetailsRecord::getMoney) .sum(); } ``` **计算规则**: - 遍历所有今日收入记录 - 累加 `money` 字段(单位:分) - 包含所有收入类型: - 代金券收入(incomeType=1) - 团购收入(incomeType=2) - 其他收入(incomeType=0或其他值) **空值处理**: - 如果今日无收入记录 → `totalIncome = 0` - 如果查询结果为空列表 → `totalIncome = 0` ##### 3. 金额格式转换 ```java String incomeStr = new BigDecimal(totalIncome) .divide(new BigDecimal(100), 2, RoundingMode.DOWN) .toString(); ``` **转换规则**: - **输入**:`totalIncome`(单位:分,int类型) - **输出**:`incomeStr`(单位:元,String类型) - **转换公式**:分 ÷ 100 = 元 - **精度**:保留2位小数 - **舍入模式**:DOWN(向下舍入/截断) **示例**: | 原始值(分) | 转换后(元) | 说明 | |-------------|-------------|------| | 0 | "0.00" | 无收益 | | 100 | "1.00" | 1元 | | 12345 | "123.45" | 123.45元 | | 123456 | "1234.56" | 1234.56元 | | 99999 | "999.99" | 999.99元 | | 1000099 | "10000.99" | 10000.99元 | **舍入示例**: | 原始值(分) | DOWN模式 | HALF_UP模式(对比)| |-------------|----------|-------------------| | 12344 | "123.44" | "123.44" | | 12345 | "123.45" | "123.45" | | 12346 | "123.46" | "123.46" | 注:本接口使用 DOWN 模式,直接截断小数部分,不进行四舍五入。 --- ## 数据库表结构 ### store_income_details_record(商户收入明细表) | 字段名 | 类型 | 说明 | |--------|------|------| | id | INT | 主键,自增 | | store_id | INT | 店铺ID | | income_type | INT | 收入类型(0:全部, 1:代金, 2:团购)| | business_id | INT | 业务ID(优惠券ID或团购ID)| | money | INT | 收入金额(单位:分)| | commission | INT | 手续费(单位:分)| | user_order_id | INT | 用户订单ID | | cash_out_id | INT | 提现记录ID(提现后才有值)| | delete_flag | INT | 删除标记(0:未删除, 1:已删除)| | created_time | DATETIME | 创建时间(收益到账时间)| | updated_time | DATETIME | 更新时间 | **重要索引**: - PRIMARY KEY (`id`) - INDEX `idx_store_created` (`store_id`, `created_time`) - INDEX `idx_created_time` (`created_time`) **说明**: - `money` 字段存储的是收入金额(不含手续费) - `commission` 字段存储的是平台手续费 - 实际到账金额 = `money` - `commission` - 本接口统计的是 `money` 字段总和(收入金额) --- ## 业务场景 ### 场景 1:正常查询今日收益 **请求**: ``` GET /alienStorePlatform/storeManage/getTodayIncome?storeId=102 ``` **数据库数据**(假设今天是2025-01-15): | id | store_id | income_type | money(分)| created_time | |----|----------|-------------|-----------|--------------| | 1 | 102 | 1 | 5000 | 2025-01-15 10:30:00 | | 2 | 102 | 2 | 8000 | 2025-01-15 14:20:00 | | 3 | 102 | 1 | 3456 | 2025-01-15 18:45:00 | **计算过程**: 1. 查询今日收入记录:3条 2. 累加金额:5000 + 8000 + 3456 = 16456(分) 3. 转换为元:16456 ÷ 100 = 164.56(元) **响应**: ```json { "code": 200, "msg": "查询成功", "data": "164.56", "success": true } ``` --- ### 场景 2:今日无收益 **请求**: ``` GET /alienStorePlatform/storeManage/getTodayIncome?storeId=102 ``` **数据库数据**: - 今日(2025-01-15)无收入记录 **响应**: ```json { "code": 200, "msg": "查询成功", "data": "0.00", "success": true } ``` --- ### 场景 3:跨天收益统计 **说明**:收益按 `created_time` 归属日期 **数据库数据**: | id | store_id | money(分)| created_time | |----|----------|-----------|--------------| | 1 | 102 | 5000 | 2025-01-14 23:59:59 | | 2 | 102 | 8000 | 2025-01-15 00:00:00 | | 3 | 102 | 3456 | 2025-01-15 23:59:59 | | 4 | 102 | 2000 | 2025-01-16 00:00:00 | **2025-01-15 的收益**: - 包含记录:id=2, id=3 - 总金额:8000 + 3456 = 11456(分)= 114.56(元) **响应**(查询日期:2025-01-15): ```json { "code": 200, "msg": "查询成功", "data": "114.56", "success": true } ``` --- ### 场景 4:包含不同收入类型 **数据库数据**: | id | store_id | income_type | money(分)| created_time | 说明 | |----|----------|-------------|-----------|--------------|------| | 1 | 102 | 1 | 5000 | 2025-01-15 10:00:00 | 代金券 | | 2 | 102 | 2 | 8000 | 2025-01-15 14:00:00 | 团购 | | 3 | 102 | 0 | 2000 | 2025-01-15 18:00:00 | 其他 | **统计结果**: - 所有类型都统计:5000 + 8000 + 2000 = 15000(分)= 150.00(元) **响应**: ```json { "code": 200, "msg": "查询成功", "data": "150.00", "success": true } ``` --- ## 相关文件 ### Controller 层 - `alien-store-platform/src/main/java/shop/alien/storeplatform/controller/StoreManageController.java` ### Service 层 - `alien-store-platform/src/main/java/shop/alien/storeplatform/service/StoreManageService.java` - `alien-store-platform/src/main/java/shop/alien/storeplatform/service/impl/StoreManageServiceImpl.java` ### Entity/Mapper 层 - `alien-entity/src/main/java/shop/alien/entity/store/StoreIncomeDetailsRecord.java` - `alien-entity/src/main/java/shop/alien/mapper/StoreIncomeDetailsRecordMapper.java` --- ## 测试建议 ### 测试用例 1:正常查询 **前置条件**: - 店铺ID存在 - 今日有收入记录 ```bash curl -X GET "http://localhost:8080/alienStorePlatform/storeManage/getTodayIncome?storeId=102" ``` **期望结果**: - 返回今日总收益(元) - 格式:字符串,保留两位小数 - 示例:`"123.45"` --- ### 测试用例 2:今日无收益 **前置条件**: - 店铺ID存在 - 今日无收入记录 ```bash curl -X GET "http://localhost:8080/alienStorePlatform/storeManage/getTodayIncome?storeId=102" ``` **期望结果**: ```json { "code": 200, "data": "0.00", "success": true } ``` --- ### 测试用例 3:跨天查询 **测试步骤**: 1. 在 23:50 查询今日收益 2. 在 00:10 查询今日收益(第二天) 3. 对比两次结果 **期望结果**: - 两次查询结果不同 - 第二次查询应该是新的一天的收益 --- ### 测试用例 4:多种收入类型 **前置条件**: - 今日有代金券收入 - 今日有团购收入 - 今日有其他类型收入 **期望结果**: - 返回所有类型收入的总和 --- ### 测试用例 5:金额格式验证 **验证不同金额的格式化**: | 数据库值(分) | API返回(元) | |---------------|--------------| | 0 | "0.00" | | 1 | "0.01" | | 10 | "0.10" | | 100 | "1.00" | | 999 | "9.99" | | 12345 | "123.45" | | 1000000 | "10000.00" | --- ## 注意事项 ### 1. 时间范围 - ⚠️ **查询范围**:今日 00:00:00 至 23:59:59 - ⚠️ **时区**:使用数据库服务器时间 - ⚠️ **跨天处理**:按 `created_time` 归属日期,不受查询时间影响 ### 2. 金额单位 - ⚠️ **数据库存储**:分(Integer) - ⚠️ **接口返回**:元(String) - ⚠️ **转换规则**:分 ÷ 100 = 元 - ⚠️ **精度**:保留2位小数 - ⚠️ **舍入模式**:DOWN(向下截断) ### 3. 收入类型 本接口统计所有收入类型: | income_type | 说明 | |-------------|------| | 0 | 全部/其他 | | 1 | 代金券 | | 2 | 团购 | - ⚠️ 不区分收入类型,全部统计 - ⚠️ 如需按类型统计,需要调用其他接口 ### 4. 手续费处理 - ⚠️ 本接口统计的是 `money` 字段(收入金额) - ⚠️ **不扣除** `commission` 字段(手续费) - ⚠️ 实际到账金额需要减去手续费 **示例**: ``` 收入金额(money): 10000分 = 100.00元 手续费(commission): 300分 = 3.00元 实际到账: 9700分 = 97.00元 本接口返回: "100.00"(收入金额) ``` ### 5. 逻辑删除 - ⚠️ MyBatis-Plus 自动过滤 `delete_flag=1` 的记录 - ⚠️ 已删除的收入记录不会被统计 - ⚠️ 确保业务逻辑正确处理删除标记 ### 6. 性能优化 **数据库索引**: ```sql CREATE INDEX idx_store_created ON store_income_details_record(store_id, created_time); ``` **查询优化**: - ✅ 使用复合索引(store_id + created_time) - ✅ 时间范围查询使用字符串拼接(与数据库格式一致) - ✅ Stream API 高效计算总和 ### 7. 数据一致性 - ⚠️ 收益数据可能存在延迟(如T+3到账) - ⚠️ 本接口统计的是 `created_time`(记录创建时间) - ⚠️ 实际收益到账时间可能与统计时间不同 --- ## 接口对比 | 功能 | 原接口(alien-store) | 新接口(alien-store-platform) | |------|----------------------|-------------------------------| | 今日收益 | `/alienStore/storeIncomeDetailsRecord/todayIncome` | `/alienStorePlatform/storeManage/getTodayIncome` | | Controller | `StoreIncomeDetailsRecordController` | `StoreManageController` | | Service | `StoreIncomeDetailsRecordService` | `StoreManageService` | **主要变化**: - ✅ 接口路径更符合web端命名规范 - ✅ 整合到 `StoreManageController` 统一管理 - ✅ 代码注释更完善,逻辑更清晰 --- ## 扩展功能建议 ### 1. 按收入类型统计 ```java public Map getTodayIncomeByType(Integer storeId) { // 按 incomeType 分组统计 } ``` ### 2. 查询指定日期收益 ```java public String getIncomeByDate(Integer storeId, String date) { // 查询指定日期的收益 } ``` ### 3. 查询日期范围收益 ```java public String getIncomeByDateRange(Integer storeId, String startDate, String endDate) { // 查询日期范围的总收益 } ``` ### 4. 今日收益明细 ```java public List getTodayIncomeDetails(Integer storeId) { // 返回今日所有收入记录 } ``` --- ## 版本记录 | 版本 | 日期 | 说明 | 作者 | |------|------|------|------| | 1.0.0 | 2025-01-xx | 初始版本,迁移今日收益查询功能 | ssk | --- ## 联系方式 如有问题,请联系: - 开发团队:Alien Cloud Team - 邮箱:dev@alien.shop