From 668787f053c83193449055cd789e90cd8cf4aa56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E4=BD=B3=E8=B1=AA?= <18505142974@163.com> Date: Mon, 4 Aug 2025 14:42:21 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=A7=86=E9=A2=91=E7=BC=93?= =?UTF-8?q?=E5=AD=98=E5=92=8C=E5=95=86=E5=93=81=E7=BC=93=E5=AD=98=E5=92=8C?= =?UTF-8?q?=E8=8E=B7=E5=8F=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi-content/README_定时任务.md | 94 +++++++++++++++ .../content/controller/VlogController.java | 33 +++++- .../wzj/soopin/content/mapper/VlogMapper.java | 29 +++++ .../soopin/content/service/VlogService.java | 7 ++ .../content/service/impl/VlogServiceImpl.java | 16 +++ .../content/task/VlogScheduledTask.java | 35 ++++++ .../ruoyi-order/README_定时任务.md | 111 ++++++++++++++++++ .../soopin/order/task/OrderScheduledTask.java | 35 ++++++ .../CommissionSectionController.java | 107 +++++++++++++++++ .../CommissionTemplateController.java | 106 +++++++++++++++++ .../convert/CommissionSectionConvert.java | 14 +++ .../convert/CommissionTemplateConvert.java | 11 ++ .../convert/SysTenantAccountConvert.java | 13 ++ .../system/domain/CommissionSection.java | 52 ++++++++ .../system/domain/CommissionTemplate.java | 46 ++++++++ .../system/domain/SysTenantAccount.java | 33 ++++++ .../system/domain/bo/CommissionSectionBo.java | 76 ++++++++++++ .../domain/bo/CommissionTemplateBo.java | 59 ++++++++++ .../system/domain/bo/SysTenantAccountBo.java | 59 ++++++++++ .../system/domain/vo/CommissionSectionVo.java | 42 +++++++ .../domain/vo/CommissionTemplateVo.java | 41 +++++++ .../system/domain/vo/SysTenantAccountVo.java | 35 ++++++ .../mapper/CommissionSectionMapper.java | 11 ++ .../mapper/CommissionTemplateMapper.java | 11 ++ .../system/mapper/SysTenantAccountMapper.java | 13 ++ .../service/ICommissionSectionService.java | 45 +++++++ .../service/ICommissionTemplateService.java | 40 +++++++ .../service/ISysTenantAccountService.java | 19 +++ .../impl/CommissionSectionServiceImpl.java | 101 ++++++++++++++++ .../impl/CommissionTemplateServiceImpl.java | 68 +++++++++++ .../impl/SysTenantAccountServiceImpl.java | 61 ++++++++++ 31 files changed, 1419 insertions(+), 4 deletions(-) create mode 100644 ruoyi-modules/ruoyi-content/README_定时任务.md create mode 100644 ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java create mode 100644 ruoyi-modules/ruoyi-order/README_定时任务.md create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionSectionController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionTemplateController.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionSectionConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionTemplateConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/SysTenantAccountConvert.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionSection.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionTemplate.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantAccount.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionSectionBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionTemplateBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantAccountBo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionSectionVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionTemplateVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantAccountVo.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionSectionMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionTemplateMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantAccountMapper.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionSectionService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionTemplateService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantAccountService.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionSectionServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionTemplateServiceImpl.java create mode 100644 ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantAccountServiceImpl.java diff --git a/ruoyi-modules/ruoyi-content/README_定时任务.md b/ruoyi-modules/ruoyi-content/README_定时任务.md new file mode 100644 index 000000000..04bfc55af --- /dev/null +++ b/ruoyi-modules/ruoyi-content/README_定时任务.md @@ -0,0 +1,94 @@ +# 视频点赞排行榜定时任务 + +## 功能说明 + +本功能实现了每天12点自动查询点赞最多的100条视频并存储到Redis中的定时任务。缓存时会先打乱顺序,然后按点赞数排序存储。 + +## 实现内容 + +### 1. 数据库查询 +- 在 `VlogMapper` 中添加了 `selectAllPublicVlogs` 方法 +- 在 `VlogMapper` 中添加了 `selectRandomVlogs` 方法(随机查询视频) +- 查询条件:状态为1(审核通过)且非私密视频 +- 获取所有公开视频的基本信息 + +### 2. 服务层实现 +- 在 `VlogService` 接口中添加了 `cacheTopLikedVlogs` 方法 +- 在 `VlogService` 接口中添加了 `getRandomVlogs` 方法 +- 在 `VlogServiceImpl` 中实现了缓存逻辑 +- 从Redis中获取每个视频的点赞数量(key格式:`redis_vlog_be_liked_counts:{vlogId}`) +- **缓存逻辑优化**:先打乱视频顺序,然后按Redis中的点赞数排序,获取前100个最受欢迎的视频 +- 将查询结果以JSON格式存储到Redis,过期时间为24小时 + +### 3. 定时任务 +- 创建了 `VlogScheduledTask` 定时任务类 +- 使用 `@Scheduled(cron = "0 0 12 * * ?")` 配置每天12点执行 +- 在主应用类 `DromaraApplication` 上添加了 `@EnableScheduling` 注解 + +### 4. 控制器接口 +- 添加了手动触发缓存的接口:`POST /vlog/cacheTopLikedVlogs` +- 添加了获取缓存数据的接口:`GET /vlog/getTopLikedVlogs` + +## 使用方法 + +### 1. 自动执行 +定时任务会在每天12点自动执行,无需手动干预。 + +### 2. 手动触发 +如果需要立即执行缓存任务,可以调用以下接口: + +```bash +POST /vlog/cacheTopLikedVlogs?limit=100 +``` + +参数说明: +- `limit`: 查询的视频数量,默认为100 + +### 3. 查看缓存结果 +可以通过以下接口查看缓存的数据: + +```bash +GET /vlog/getTopLikedVlogs +GET /vlog/getTopLikedVlogs?date=2024-01-15 +GET /vlog/getTopLikedVlogs?pageSize=10&pageNum=0 +``` + +参数说明: +- `date`: 指定日期,格式为 yyyy-MM-dd,如果不传则使用当天日期 +- `pageSize`: 每页返回的视频数量,默认为10 +- `pageNum`: 页码,从0开始,默认为0 + +**获取逻辑**: +1. 首先从Redis缓存中获取指定页的视频数据 +2. 如果Redis中的数据不足,会从数据库随机查询补充 +3. 确保每次返回指定数量的视频 + +## Redis存储格式 + +缓存数据以JSON格式存储在Redis中,key格式为: +``` +top_liked_vlogs:yyyy-MM-dd +``` + +例如:`top_liked_vlogs:2024-01-15` + +数据包含视频的完整信息,包括: +- 视频ID、标题、URL、封面 +- 点赞数、评论数(包含Redis中的实际点赞数:`redis_like_count`) +- 上传者ID、创建时间等 + +## 注意事项 + +1. 确保Redis服务正常运行 +2. 确保数据库连接正常 +3. 定时任务依赖于Spring Boot的调度功能,需要确保应用正常运行 +4. 缓存数据有效期为24小时,过期后需要重新执行任务 +5. 缓存时会先打乱视频顺序,确保数据的随机性 +6. 获取视频时会优先从Redis获取,不足时从数据库随机查询补充 + +## 日志监控 + +定时任务的执行情况会记录在应用日志中,可以通过以下关键字搜索: +- "开始执行定时任务:查询点赞最多的100条视频并存储到Redis" +- "定时任务执行完成:成功缓存点赞最多的100条视频到Redis" +- "定时任务执行失败:缓存点赞最多视频到Redis时发生异常" \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java index 69ec7b2b2..47dc0f16d 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/controller/VlogController.java @@ -29,6 +29,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; +import java.util.ArrayList; @Slf4j @Api(tags = "VlogController 短视频相关业务功能的接口") @@ -318,7 +319,9 @@ public class VlogController extends BaseInfoProperties { @Tag(name = "获取缓存中的点赞最多视频") @GetMapping("/getTopLikedVlogs") - public R getTopLikedVlogs(@RequestParam(defaultValue = "") String date) { + public R getTopLikedVlogs(@RequestParam(defaultValue = "") String date, + @RequestParam(defaultValue = "10") int pageSize, + @RequestParam(defaultValue = "0") int pageNum) { try { String redisKey; if (StringUtils.isBlank(date)) { @@ -329,14 +332,36 @@ public class VlogController extends BaseInfoProperties { } String cachedData = redis.get(redisKey); + List> resultList = new ArrayList<>(); + if (StringUtils.isNotBlank(cachedData)) { // 解析JSON数据 ObjectMapper objectMapper = new ObjectMapper(); List> vlogList = objectMapper.readValue(cachedData, new com.fasterxml.jackson.core.type.TypeReference>>() {}); - return R.ok(vlogList); - } else { - return R.fail("未找到缓存数据,请先执行缓存任务"); + + // 计算分页 + int startIndex = pageNum * pageSize; + int endIndex = Math.min(startIndex + pageSize, vlogList.size()); + + if (startIndex < vlogList.size()) { + // 从Redis缓存中获取指定页的数据 + resultList = vlogList.subList(startIndex, endIndex); + log.info("从Redis缓存中获取了{}条视频数据", resultList.size()); + } } + + // 如果Redis中的数据不足,从数据库随机查询补充 + if (resultList.size() < pageSize) { + int needMore = pageSize - resultList.size(); + log.info("Redis缓存数据不足,需要从数据库随机查询{}条视频", needMore); + + // 从数据库随机查询视频 + List> randomVlogs = vlogService.getRandomVlogs(needMore); + resultList.addAll(randomVlogs); + log.info("从数据库随机查询了{}条视频", randomVlogs.size()); + } + + return R.ok(resultList); } catch (Exception e) { log.error("获取缓存中的点赞最多视频失败", e); return R.fail("获取缓存失败: " + e.getMessage()); diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/VlogMapper.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/VlogMapper.java index 2cf73a4fa..a037f7e31 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/VlogMapper.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/mapper/VlogMapper.java @@ -139,4 +139,33 @@ public interface VlogMapper extends BaseMapper { "WHERE v.status = 1 AND v.is_private = 0 " + "ORDER BY v.create_time DESC") List> selectAllPublicVlogs(); + + /** + * 随机查询指定数量的公开视频 + * @param limit 查询数量限制 + * @return 随机视频列表 + */ + @Select("SELECT " + + " v.id, " + + " v.vloger_id, " + + " v.url, " + + " v.cover, " + + " v.title, " + + " v.width, " + + " v.height, " + + " v.like_counts, " + + " v.comments_counts, " + + " v.is_private, " + + " v.create_time, " + + " v.update_time, " + + " v.status, " + + " v.file_id, " + + " v.reason, " + + " v.city_code, " + + " v.first_frame_img " + + "FROM t_vlog v " + + "WHERE v.status = 1 AND v.is_private = 0 " + + "ORDER BY RAND() " + + "LIMIT #{limit}") + List> selectRandomVlogs(@Param("limit") int limit); } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java index f2afcbcfe..48f0a19ab 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/VlogService.java @@ -143,4 +143,11 @@ public interface VlogService { * @param limit 查询数量限制 */ void cacheTopLikedVlogs(int limit); + + /** + * 随机查询视频列表 + * @param limit 查询数量限制 + * @return 随机视频列表 + */ + List> getRandomVlogs(int limit); } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java index e64adc2fe..58e99b28b 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/VlogServiceImpl.java @@ -644,6 +644,9 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { vlogsWithLikeCounts.add(vlog); } + // 先打乱顺序 + Collections.shuffle(vlogsWithLikeCounts); + // 按Redis中的点赞数排序,获取前limit个 vlogsWithLikeCounts.sort((v1, v2) -> { int count1 = (Integer) v1.get("redis_like_count"); @@ -679,4 +682,17 @@ public class VlogServiceImpl extends BaseInfoProperties implements VlogService { log.error("缓存点赞最多视频到Redis失败", e); } } + + @Override + public List> getRandomVlogs(int limit) { + try { + log.info("开始随机查询{}条视频", limit); + List> randomVlogs = vlogMapper.selectRandomVlogs(limit); + log.info("成功随机查询到{}条视频", randomVlogs.size()); + return randomVlogs; + } catch (Exception e) { + log.error("随机查询视频失败", e); + return new ArrayList<>(); + } + } } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java new file mode 100644 index 000000000..aa64c0c3c --- /dev/null +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/task/VlogScheduledTask.java @@ -0,0 +1,35 @@ +package com.wzj.soopin.content.task; + +import com.wzj.soopin.content.service.VlogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 视频相关定时任务 + * + * @author wzj + */ +@Slf4j +@Component +public class VlogScheduledTask { + + @Autowired + private VlogService vlogService; + + /** + * 每天12点定时查询点赞最多的100条视频并存储到Redis + * cron表达式:0 0 12 * * ? (每天12点执行) + */ + @Scheduled(cron = "0 0 12 * * ?") + public void cacheTopLikedVlogs() { + log.info("开始执行定时任务:查询点赞最多的100条视频并存储到Redis"); + try { + vlogService.cacheTopLikedVlogs(100); + log.info("定时任务执行完成:成功缓存点赞最多的100条视频到Redis"); + } catch (Exception e) { + log.error("定时任务执行失败:缓存点赞最多视频到Redis时发生异常", e); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-order/README_定时任务.md b/ruoyi-modules/ruoyi-order/README_定时任务.md new file mode 100644 index 000000000..f15c911e8 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/README_定时任务.md @@ -0,0 +1,111 @@ +# 商品交易量排行榜定时任务 + +## 功能说明 + +本功能实现了每天12点自动查询交易量最多的100个商品并存储到Redis中的定时任务。 + +## 实现内容 + +### 1. 数据库查询 +- 在 `OrderItemMapper` 中添加了 `selectTopTradingProducts` 方法 +- 查询条件:已完成订单(status = 3)且未删除订单(delete_status = 0) +- 按销售数量降序排列,取前100个商品 +- 统计信息包括:商品ID、商品名称、图片、总销售数量、总销售金额、订单数量 + +### 2. 服务层实现 +- 在 `OrderItemService` 接口中添加了 `cacheTopTradingProducts` 方法 +- 在 `OrderItemServiceImpl` 中实现了缓存逻辑 +- 将查询结果以JSON格式存储到Redis,过期时间为24小时 + +### 3. 定时任务 +- 创建了 `OrderScheduledTask` 定时任务类 +- 使用 `@Scheduled(cron = "0 0 12 * * ?")` 配置每天12点执行 +- 在主应用类 `DromaraApplication` 上已添加了 `@EnableScheduling` 注解 + +### 4. 控制器接口 +- 添加了手动触发缓存的接口:`POST /oms/order/cacheTopTradingProducts` +- 添加了获取缓存数据的接口:`GET /oms/order/getTopTradingProducts` + +## 使用方法 + +### 1. 自动执行 +定时任务会在每天12点自动执行,无需手动干预。 + +### 2. 手动触发 +如果需要立即执行缓存任务,可以调用以下接口: + +```bash +POST /oms/order/cacheTopTradingProducts?limit=100 +``` + +参数说明: +- `limit`: 查询的商品数量,默认为100 + +### 3. 查看缓存结果 +可以通过以下接口查看缓存的数据: + +```bash +GET /oms/order/getTopTradingProducts +GET /oms/order/getTopTradingProducts?date=2024-01-15 +``` + +参数说明: +- `date`: 可选,指定查看某一天的缓存数据,格式为yyyy-MM-dd + +### 4. 返回数据格式 +缓存的数据包含以下字段: +- `product_id`: 商品ID +- `product_name`: 商品名称 +- `pic`: 商品图片 +- `out_product_id`: 商品编码 +- `product_category_id`: 商品分类ID +- `total_quantity`: 总销售数量 +- `total_amount`: 总销售金额 +- `order_count`: 订单数量 + +## 技术实现 + +### 1. SQL查询逻辑 +```sql +SELECT + oi.product_id, + oi.product_name, + oi.pic, + oi.out_product_id, + oi.product_category_id, + SUM(oi.quantity) as total_quantity, + SUM(oi.quantity * oi.sale_price) as total_amount, + COUNT(DISTINCT o.id) as order_count +FROM oms_order_item oi +JOIN oms_order o ON oi.order_id = o.id +WHERE o.status = 3 -- 已完成订单 + AND o.delete_status = 0 -- 未删除订单 +GROUP BY oi.product_id, oi.product_name, oi.pic, oi.out_product_id, oi.product_category_id +ORDER BY total_quantity DESC +LIMIT #{limit} +``` + +### 2. Redis缓存 +- Key格式:`top_trading_products:yyyy-MM-dd` +- 过期时间:24小时 +- 数据格式:JSON字符串 + +### 3. 异常处理 +- 完善的异常处理和日志记录 +- 手动触发接口返回详细的错误信息 +- 定时任务异常不会影响系统正常运行 + +## 注意事项 + +1. **数据准确性**:只统计已完成订单的商品,确保数据的准确性 +2. **性能考虑**:大量订单数据时,查询可能需要较长时间 +3. **缓存更新**:每天12点自动更新,也可手动触发 +4. **数据过期**:缓存数据24小时自动过期,避免数据过期问题 + +## 扩展功能 + +如需扩展功能,可以考虑: +1. 按时间范围统计(如最近7天、30天) +2. 按商品分类统计 +3. 添加更多统计维度(如销售额、利润率等) +4. 支持多租户数据隔离 \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java new file mode 100644 index 000000000..b19a2c9de --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/task/OrderScheduledTask.java @@ -0,0 +1,35 @@ +package com.wzj.soopin.order.task; + +import com.wzj.soopin.order.service.OrderItemService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +/** + * 订单相关定时任务 + * + * @author wzj + */ +@Slf4j +@Component +public class OrderScheduledTask { + + @Autowired + private OrderItemService orderItemService; + + /** + * 每天12点定时查询交易量最多的100个商品并存储到Redis + * cron表达式:0 0 12 * * ? (每天12点执行) + */ + @Scheduled(cron = "0 0 12 * * ?") + public void cacheTopTradingProducts() { + log.info("开始执行定时任务:查询交易量最多的100个商品并存储到Redis"); + try { + orderItemService.cacheTopTradingProducts(100); + log.info("定时任务执行完成:成功缓存交易量最多的100个商品到Redis"); + } catch (Exception e) { + log.error("定时任务执行失败:缓存交易量最多商品到Redis时发生异常", e); + } + } +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionSectionController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionSectionController.java new file mode 100644 index 000000000..0ae76624c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionSectionController.java @@ -0,0 +1,107 @@ +package org.dromara.system.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import cn.hutool.core.convert.Convert; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.system.domain.bo.CommissionSectionBo; +import org.dromara.system.domain.bo.CommissionTemplateBo; +import org.dromara.system.domain.dto.CommissionSectionBatchAddDTO; +import org.dromara.system.domain.vo.CommissionSectionVo; +import org.dromara.system.domain.vo.CommissionTemplateVo; +import org.dromara.system.service.ICommissionSectionService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +import org.dromara.system.domain.CommissionSection; + +import org.dromara.system.service.ICommissionTemplateService; +import org.dromara.system.convert.CommissionSectionConvert; + + +/** + * 分成比例区间接口 + */ +@Tag(name = "分成比例区间管理") +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/commission-section") +public class CommissionSectionController { + private final ICommissionSectionService commissionSectionService; + private final CommissionSectionConvert convert; + + + + /** 分页查询 */ + @Tag(name = "查询分成比例区间列表") + @SaCheckPermission("system:commissionsection:list") + @PostMapping("/list") + public R> list(@RequestBody CommissionSectionBo bo, @RequestBody Page page) { + Page memberPage = commissionSectionService.page(page,bo.toWrapper()); + TableDataInfo.build(memberPage); + return R.ok(convert.toVO(memberPage)); + } + + /** 查询详情 */ + @Operation(summary = "查询分成比例区间详情") + @GetMapping("/{id}") + public R getInfo(@Parameter(description = "主键ID") @PathVariable Integer id) { + return R.ok(commissionSectionService.queryById(id)); + } + + /** 新增 */ + @Operation(summary = "新增分成比例区间") + @Log(title = "分成比例区间", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody CommissionSectionBo bo) { + return R.ok(commissionSectionService.insertByBo(bo)); + } + + /** 修改 */ + @Operation(summary = "修改分成比例区间") + @Log(title = "分成比例区间", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + public R edit(@Validated @RequestBody CommissionSectionBatchAddDTO dto) { + List list = cn.hutool.json.JSONUtil.toList(dto.getTemplateList(), CommissionSectionBo.class); + // 给每个bo设置templateId + for (CommissionSectionBo bo : list) { + bo.setTemplateId(dto.getTemplateId()); + commissionSectionService.updateByBo(bo); + } + return R.ok(true); + } + + /** 批量新增分成比例区间 */ + @Operation(summary = "批量新增分成比例区间") + @Log(title = "分成比例区间", businessType = BusinessType.INSERT) + @PostMapping("/batch") + public R batchAdd(@RequestBody CommissionSectionBatchAddDTO dto) { + // 反序列化字符串为List + List list = cn.hutool.json.JSONUtil.toList(dto.getTemplateList(), CommissionSectionBo.class); + // 给每个bo设置templateId + for (CommissionSectionBo bo : list) { + bo.setTemplateId(dto.getTemplateId()); + commissionSectionService.insertByBo(bo); + } + return R.ok(true); + } + + /** 删除 */ + @Operation(summary = "批量删除分成比例区间") + @Log(title = "分成比例区间", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@Parameter(description = "主键ID集合") @PathVariable List ids) { + return R.ok(commissionSectionService.deleteWithValidByIds(ids, true)); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionTemplateController.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionTemplateController.java new file mode 100644 index 000000000..855f82c58 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/controller/CommissionTemplateController.java @@ -0,0 +1,106 @@ +package org.dromara.system.controller; + +import cn.dev33.satoken.annotation.SaCheckPermission; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.dromara.common.log.annotation.Log; +import org.dromara.common.log.enums.BusinessType; + +import org.dromara.system.domain.bo.CommissionTemplateBo; +import org.dromara.system.domain.vo.CommissionTemplateVo; +import org.dromara.system.service.ICommissionTemplateService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import java.util.List; + +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.system.convert.CommissionTemplateConvert; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.service.ICommissionSectionService; +import org.dromara.system.domain.vo.CommissionSectionVo; + + +/** + * 分成比例模板接口 + */ +@Tag(name = "分成比例模板管理") +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/system/commission-template") +public class CommissionTemplateController { + private final ICommissionTemplateService commissionTemplateService; + private final CommissionTemplateConvert convert; + private final ICommissionSectionService commissionSectionService; + + + /** 分页查询 */ + @Operation(summary = "分页查询分成比例模板") + @Tag(name = "查询分成比例模板列表") + @PostMapping("/list") + public R> list(@RequestBody CommissionTemplateBo bo, @RequestBody Page page) { + Page memberPage = commissionTemplateService.page(page,bo.toWrapper()); + TableDataInfo.build(memberPage); + return R.ok(convert.toVO(memberPage)); + } + + @Operation(summary = "查询全部分成比例模板") + @Tag(name = "查询分成比例模板列表") + @GetMapping("/all") + public R> listAll() { + // 查询全部,不分页 + List list = commissionTemplateService.list(); + List voList = convert.toVO(list); + return R.ok(voList); + } + /** 查询详情 */ + @Operation(summary = "查询分成比例模板详情") + @GetMapping("/{id}") + public R getInfo(@Parameter(description = "主键ID") @PathVariable Integer id) { + return R.ok(commissionTemplateService.queryById(id)); + } + + /** 新增 */ + @Operation(summary = "新增分成比例模板") + @Log(title = "分成比例模板", businessType = BusinessType.INSERT) + @PostMapping + public R add(@Validated @RequestBody CommissionTemplateBo bo) { + return R.ok(commissionTemplateService.insertByBo(bo)); + } + + /** 修改 */ + @Operation(summary = "修改分成比例模板") + @Log(title = "分成比例模板", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + public R edit(@Validated @RequestBody CommissionTemplateBo bo) { + return R.ok(commissionTemplateService.updateByBo(bo)); + } + + /** 删除 */ + @Operation(summary = "批量删除分成比例模板") + @Log(title = "分成比例模板", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public R remove(@Parameter(description = "主键ID集合") @PathVariable List ids) { + return R.ok(commissionTemplateService.deleteWithValidByIds(ids, true)); + } + + /** 根据模板ID查询区间比例列表(POST风格) */ + @Operation(summary = "根据模板ID查询区间比例列表") + @PostMapping("/sections") + public R> getSectionsByTemplateId(@RequestBody TemplateIdRequest req) { + List list = commissionSectionService.queryListByTemplateId(req.getTemplateId()); + return R.ok(list); + } + + // DTO + public static class TemplateIdRequest { + private Integer templateId; + public Integer getTemplateId() { return templateId; } + public void setTemplateId(Integer templateId) { this.templateId = templateId; } + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionSectionConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionSectionConvert.java new file mode 100644 index 000000000..46a27e264 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionSectionConvert.java @@ -0,0 +1,14 @@ +package org.dromara.system.convert; + +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.bo.CommissionSectionBo; +import org.dromara.system.domain.vo.CommissionSectionVo; +import org.dromara.common.web.core.BaseConverter; +import org.mapstruct.Mapper; + +/** + * @author 86132 + */ +@Mapper(componentModel = "spring") +public interface CommissionSectionConvert extends BaseConverter { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionTemplateConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionTemplateConvert.java new file mode 100644 index 000000000..8dbdd373c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/CommissionTemplateConvert.java @@ -0,0 +1,11 @@ +package org.dromara.system.convert; + +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.system.domain.bo.CommissionTemplateBo; +import org.dromara.system.domain.vo.CommissionTemplateVo; +import org.dromara.common.web.core.BaseConverter; +import org.mapstruct.Mapper; + +@Mapper(componentModel = "spring") +public interface CommissionTemplateConvert extends BaseConverter { +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/SysTenantAccountConvert.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/SysTenantAccountConvert.java new file mode 100644 index 000000000..048a47523 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/convert/SysTenantAccountConvert.java @@ -0,0 +1,13 @@ +package org.dromara.system.convert; + +import org.dromara.common.web.core.BaseConverter; +import org.dromara.system.domain.SysTenantAccount; +import org.dromara.system.domain.bo.SysTenantAccountBo; +import org.dromara.system.domain.vo.SysTenantAccountVo; +import org.mapstruct.Mapper; +import java.util.List; + +@Mapper(componentModel = "spring") +public interface SysTenantAccountConvert extends BaseConverter { + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionSection.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionSection.java new file mode 100644 index 000000000..6042110b7 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionSection.java @@ -0,0 +1,52 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.model.BaseAudit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.tenant.core.TenantEntity; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 分成比例区间表 commission_section + * @author 86132 + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("commission_rate_range") +@Schema(name = "CommissionSection", description = "分成比例区间表") +public class CommissionSection extends BaseAudit { + /** 主键,自增ID */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "主键,自增ID") + private Integer id; + + /** 所属模板ID,关联commission_template表 */ + @Schema(description = "所属模板ID,关联commission_template表") + private Integer templateId; + + /** 区间下限(包含),单位:元 */ + @Schema(description = "区间下限(包含),单位:元") + private BigDecimal minAmount; + + /** 区间上限(包含),单位:元 */ + @Schema(description = "区间上限(包含),单位:元") + private BigDecimal maxAmount; + + /** 分成比例(如0.6000表示60%) */ + @Schema(description = "分成比例(如0.6000表示60%)") + private BigDecimal rate; + + /** 区间名称 */ + @Schema(description = "名称") + private String rateName; + + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionTemplate.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionTemplate.java new file mode 100644 index 000000000..f6483e390 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/CommissionTemplate.java @@ -0,0 +1,46 @@ +package org.dromara.system.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import org.dromara.common.core.domain.model.BaseAudit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.common.tenant.core.TenantEntity; +import java.time.LocalDateTime; + +/** + * 分成比例模板表 commission_template + * @author 86132 + */ +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName("commission_template") +@Schema(name = "CommissionTemplate", description = "分成比例模板表") +public class CommissionTemplate extends BaseAudit { + /** 主键,自增ID */ + @TableId(value = "id", type = IdType.AUTO) + @Schema(description = "主键,自增ID") + private Integer id; + + /** 模板名称,唯一标识一个分成模板 */ + @Schema(description = "模板名称,唯一标识一个分成模板") + private String templateName; + + /** 模板描述,简要说明模板用途 */ + @Schema(description = "模板描述,简要说明模板用途") + private String description; + + /** 是否启用:1=启用,0=禁用 */ + @Schema(description = "是否启用:1=启用,0=禁用") + private Integer isActive; + + /** 模板类型 */ + @Schema(description = "类型") + private String templateType; + +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantAccount.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantAccount.java new file mode 100644 index 000000000..892c99a67 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/SysTenantAccount.java @@ -0,0 +1,33 @@ +package org.dromara.system.domain; + +import lombok.Data; +import org.dromara.common.core.domain.model.BaseAudit; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.math.BigDecimal; +import java.util.Date; + +@Data +@Schema(description = "租户账户实体") +public class SysTenantAccount extends BaseAudit { + @Schema(description = "主键ID") + private Long id; + @Schema(description = "租户ID") + private Long tenantId; + @Schema(description = "积分余额") + private BigDecimal integralBalance; + @Schema(description = "累计积分余额") + private BigDecimal totalIntegralBalance; + @Schema(description = "现金余额") + private BigDecimal moneyBalance; + @Schema(description = "钱包余额") + private BigDecimal wallet; + @Schema(description = "累计收益") + private BigDecimal revenue; + @Schema(description = "创建人") + private Long createBy; + @Schema(description = "更新人") + private Long updateBy; + @Schema(description = "账户类型 1商家 2代理 3平台") + private Integer type; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionSectionBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionSectionBo.java new file mode 100644 index 000000000..7318cae82 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionSectionBo.java @@ -0,0 +1,76 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.github.linpeilie.annotations.AutoMapper; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.DecimalMax; +import jakarta.validation.constraints.DecimalMin; +import jakarta.validation.constraints.Digits; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.BaseAudit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.CommissionSection; +import java.math.BigDecimal; + +/** + * 分成比例区间业务对象 commission_section + * @author 86132 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = CommissionSection.class, reverseConvertGenerate = false) +@Schema(name = "CommissionSectionBo", description = "分成比例区间业务对象") +public class CommissionSectionBo extends BaseAudit { + /** 主键 */ + @Schema(description = "主键") + private Integer id; + + /** 所属模板ID */ + @Schema(description = "所属模板ID") + @NotNull(message = "所属模板ID不能为空") + private Integer templateId; + + /** 区间下限(包含),单位:元 */ + @Schema(description = "区间下限(包含),单位:元") + + @Digits(integer = 17, fraction = 2, message = "区间下限最多19位,含2位小数") + private BigDecimal minAmount; + + /** 区间上限(包含),单位:元 */ + @Schema(description = "区间上限(包含),单位:元") + + @Digits(integer = 17, fraction = 2, message = "区间上限最多19位,含2位小数") + private BigDecimal maxAmount; + + /** 分成比例(如0.6000表示60%) */ + @Schema(description = "分成比例(如0.6000表示60%)") + + @Digits(integer = 1, fraction = 4, message = "分成比例最多5位,含4位小数") + private BigDecimal rate; + + /** 区间名称 */ + @Schema(description = "名称") + private String rateName; + + /** + * 构建分页查询条件 + */ + public LambdaQueryWrapper toWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (this.getTemplateId() != null) { + wrapper.eq(CommissionSection::getTemplateId, this.getTemplateId()); + } + if (this.getMinAmount() != null) { + wrapper.ge(CommissionSection::getMinAmount, this.getMinAmount()); + } + if (this.getMaxAmount() != null) { + wrapper.le(CommissionSection::getMaxAmount, this.getMaxAmount()); + } + if (this.getRate() != null) { + wrapper.eq(CommissionSection::getRate, this.getRate()); + } + return wrapper; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionTemplateBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionTemplateBo.java new file mode 100644 index 000000000..95e681ab4 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/CommissionTemplateBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import io.github.linpeilie.annotations.AutoMapper; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.dromara.common.core.domain.model.BaseAudit; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.CommissionTemplate; + +/** + * 分成比例模板业务对象 commission_template + */ +@Data +@EqualsAndHashCode(callSuper = true) +@AutoMapper(target = CommissionTemplate.class, reverseConvertGenerate = false) +@Schema(name = "CommissionTemplateBo", description = "分成比例模板业务对象") +public class CommissionTemplateBo extends BaseAudit { + /** 主键 */ + @Schema(description = "主键") + private Integer id; + + /** 模板名称,唯一标识一个分成模板 */ + @Schema(description = "模板名称,唯一标识一个分成模板") + @NotBlank(message = "模板名称不能为空") + @Size(max = 100, message = "模板名称长度不能超过100个字符") + private String templateName; + + /** 模板描述 */ + @Schema(description = "模板描述") + @Size(max = 255, message = "模板描述长度不能超过255个字符") + private String description; + + /** 模板类型 */ + @Schema(description = "类型") + private String templateType; + + /** 是否启用:1=启用,0=禁用 */ + @Schema(description = "是否启用:1=启用,0=禁用") + private Integer isActive; + + /** + * 构建分页查询条件 + */ + public LambdaQueryWrapper toWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (this.getTemplateName() != null && !this.getTemplateName().isEmpty()) { + wrapper.like(CommissionTemplate::getTemplateName, this.getTemplateName()); + } + if (this.getIsActive() != null) { + wrapper.eq(CommissionTemplate::getIsActive, this.getIsActive()); + } + return wrapper; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantAccountBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantAccountBo.java new file mode 100644 index 000000000..9197c1ac0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysTenantAccountBo.java @@ -0,0 +1,59 @@ +package org.dromara.system.domain.bo; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import org.dromara.common.core.domain.model.BaseAudit; +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.SysTenantAccount; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "租户账户业务对象") +public class SysTenantAccountBo extends BaseAudit { + @Schema(description = "主键ID") + private Long id; + @Schema(description = "租户ID") + private Long tenantId; + @Schema(description = "积分余额") + private BigDecimal integralBalance; + @Schema(description = "累计积分余额") + private BigDecimal totalIntegralBalance; + @Schema(description = "现金余额") + private BigDecimal moneyBalance; + @Schema(description = "钱包余额") + private BigDecimal wallet; + @Schema(description = "累计收益") + private BigDecimal revenue; + @Schema(description = "创建人") + private Long createBy; + @Schema(description = "更新人") + private Long updateBy; + @Schema(description = "账户类型 1商家 2代理 3平台") + private Integer type; + + public LambdaQueryWrapper toWrapper() { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (id != null) { + wrapper.eq(SysTenantAccount::getId, id); + } + if (type != null) { + wrapper.eq(SysTenantAccount::getType, type); + } + if (tenantId != null) { + wrapper.eq(SysTenantAccount::getTenantId, tenantId); + } + + if (wallet != null) { + wrapper.eq(SysTenantAccount::getWallet, wallet); + } + if (revenue != null) { + wrapper.eq(SysTenantAccount::getRevenue, revenue); + } + + + return wrapper; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionSectionVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionSectionVo.java new file mode 100644 index 000000000..88fac48da --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionSectionVo.java @@ -0,0 +1,42 @@ +package org.dromara.system.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 分成比例区间返回对象 commission_section + * @author 86132 + */ +@Data +@Schema(name = "CommissionSectionVo", description = "分成比例区间返回对象") +public class CommissionSectionVo { + /** 主键 */ + @Schema(description = "主键") + private Integer id; + + /** 所属模板ID */ + @Schema(description = "所属模板ID") + private Integer templateId; + + /** 区间下限 */ + @Schema(description = "区间下限") + private BigDecimal minAmount; + + /** 区间上限 */ + @Schema(description = "区间上限") + private BigDecimal maxAmount; + + /** 分成比例 */ + @Schema(description = "分成比例") + private BigDecimal rate; + + /** 区间名称 */ + @Schema(description = "名称") + private String rateName; + + /** 创建时间 */ + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionTemplateVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionTemplateVo.java new file mode 100644 index 000000000..5d1a26ded --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/CommissionTemplateVo.java @@ -0,0 +1,41 @@ +package org.dromara.system.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import java.time.LocalDateTime; + +/** + * 分成比例模板返回对象 commission_template + * @author 86132 + */ +@Data +@Schema(name = "CommissionTemplateVo", description = "分成比例模板返回对象") +public class CommissionTemplateVo { + /** 主键 */ + @Schema(description = "主键") + private Integer id; + + /** 模板名称 */ + @Schema(description = "模板名称") + private String templateName; + + /** 模板描述 */ + @Schema(description = "模板描述") + private String description; + + /** 是否启用 */ + @Schema(description = "是否启用") + private Integer isActive; + + /** 模板类型 */ + @Schema(description = "类型") + private String templateType; + + /** 创建时间 */ + @Schema(description = "创建时间") + private LocalDateTime createTime; + + /** 最后更新时间 */ + @Schema(description = "最后更新时间") + private LocalDateTime updateTime; +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantAccountVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantAccountVo.java new file mode 100644 index 000000000..9a9715693 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysTenantAccountVo.java @@ -0,0 +1,35 @@ +package org.dromara.system.domain.vo; + +import lombok.Data; +import java.math.BigDecimal; +import java.util.Date; +import io.swagger.v3.oas.annotations.media.Schema; + +@Data +@Schema(description = "租户账户视图对象") +public class SysTenantAccountVo { + @Schema(description = "主键ID") + private Long id; + @Schema(description = "租户ID") + private Long tenantId; + @Schema(description = "积分余额") + private BigDecimal integralBalance; + @Schema(description = "累计积分余额") + private BigDecimal totalIntegralBalance; + @Schema(description = "更新时间") + private Date updateTime; + @Schema(description = "创建时间") + private Date createTime; + @Schema(description = "现金余额") + private BigDecimal moneyBalance; + @Schema(description = "钱包余额") + private BigDecimal wallet; + @Schema(description = "累计收益") + private BigDecimal revenue; + @Schema(description = "创建人") + private Long createBy; + @Schema(description = "更新人") + private Long updateBy; + @Schema(description = "账户类型 1商家 2代理 3平台") + private Integer type; +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionSectionMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionSectionMapper.java new file mode 100644 index 000000000..5058deed0 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionSectionMapper.java @@ -0,0 +1,11 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.vo.CommissionSectionVo; + +/** + * 分成比例区间Mapper接口 + */ +public interface CommissionSectionMapper extends BaseMapperPlus { +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionTemplateMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionTemplateMapper.java new file mode 100644 index 000000000..ca7dba421 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/CommissionTemplateMapper.java @@ -0,0 +1,11 @@ +package org.dromara.system.mapper; + +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.system.domain.vo.CommissionTemplateVo; + +/** + * 分成比例模板Mapper接口 + */ +public interface CommissionTemplateMapper extends BaseMapperPlus { +} \ No newline at end of file diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantAccountMapper.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantAccountMapper.java new file mode 100644 index 000000000..65fc873d5 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTenantAccountMapper.java @@ -0,0 +1,13 @@ +package org.dromara.system.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.SysTenantAccount; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.system.domain.vo.CommissionSectionVo; +import org.dromara.system.domain.vo.SysTenantAccountVo; + +@Mapper +public interface SysTenantAccountMapper extends BaseMapperPlus { +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionSectionService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionSectionService.java new file mode 100644 index 000000000..ea50d5b1c --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionSectionService.java @@ -0,0 +1,45 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.bo.CommissionSectionBo; +import org.dromara.system.domain.vo.CommissionSectionVo; + +import java.util.List; + +/** + * 分成比例区间Service接口 + */ +public interface ICommissionSectionService extends IService { + /** + * 分页查询分成比例区间列表 + */ + TableDataInfo queryPageList(CommissionSectionBo bo, PageQuery pageQuery); + + /** + * 查询分成比例区间详情 + */ + CommissionSectionVo queryById(Integer id); + + /** + * 新增分成比例区间 + */ + Boolean insertByBo(CommissionSectionBo bo); + + /** + * 修改分成比例区间 + */ + Boolean updateByBo(CommissionSectionBo bo); + + /** + * 批量删除分成比例区间 + */ + Boolean deleteWithValidByIds(List ids, Boolean isValid); + + /** + * 根据模板ID查询区间比例列表 + */ + List queryListByTemplateId(Integer templateId); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionTemplateService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionTemplateService.java new file mode 100644 index 000000000..370c056c6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ICommissionTemplateService.java @@ -0,0 +1,40 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.system.domain.bo.CommissionTemplateBo; +import org.dromara.system.domain.vo.CommissionTemplateVo; + +import java.util.List; + +/** + * 分成比例模板Service接口 + */ +public interface ICommissionTemplateService extends IService { + /** + * 分页查询分成比例模板列表 + */ + TableDataInfo queryPageList(CommissionTemplateBo bo, PageQuery pageQuery); + + /** + * 查询分成比例模板详情 + */ + CommissionTemplateVo queryById(Integer id); + + /** + * 新增分成比例模板 + */ + Boolean insertByBo(CommissionTemplateBo bo); + + /** + * 修改分成比例模板 + */ + Boolean updateByBo(CommissionTemplateBo bo); + + /** + * 批量删除分成比例模板 + */ + Boolean deleteWithValidByIds(List ids, Boolean isValid); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantAccountService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantAccountService.java new file mode 100644 index 000000000..bd855e3c8 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysTenantAccountService.java @@ -0,0 +1,19 @@ +package org.dromara.system.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.SysTenantAccount; +import org.dromara.system.domain.bo.SysTenantAccountBo; + +import java.util.List; + +public interface ISysTenantAccountService extends IService { + IPage pageWithTenant(Page page, SysTenantAccountBo bo); + List list(SysTenantAccountBo bo); + SysTenantAccount getById(Long id); + boolean save(SysTenantAccount po); + boolean updateById(SysTenantAccount po); + boolean removeById(Long id); +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionSectionServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionSectionServiceImpl.java new file mode 100644 index 000000000..5ad379c71 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionSectionServiceImpl.java @@ -0,0 +1,101 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.CommissionSection; +import org.dromara.system.domain.bo.CommissionSectionBo; +import org.dromara.system.domain.vo.CommissionSectionVo; +import org.dromara.system.mapper.CommissionSectionMapper; +import org.dromara.system.service.ICommissionSectionService; +import org.springframework.stereotype.Service; +import java.util.List; +import org.dromara.system.mapper.CommissionTemplateMapper; +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.common.core.exception.ServiceException; + +/** + * 分成比例区间Service实现 + */ +@RequiredArgsConstructor +@Service +public class CommissionSectionServiceImpl extends ServiceImpl implements ICommissionSectionService{ + private final CommissionSectionMapper baseMapper; + private final CommissionTemplateMapper templateMapper; + + @Override + public TableDataInfo queryPageList(CommissionSectionBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(bo.getTemplateId() != null, CommissionSection::getTemplateId, bo.getTemplateId()); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + @Override + public CommissionSectionVo queryById(Integer id) { + return baseMapper.selectVoById(id); + } + + @Override + public Boolean insertByBo(CommissionSectionBo bo) { + // 1. 查询模板类型 + CommissionTemplate template = templateMapper.selectById(bo.getTemplateId()); + if (template == null) { + throw new ServiceException("分成比例模板不存在"); + } + String templateType = template.getTemplateType(); + // 2. 校验逻辑 + if ("2".equals(templateType)) { + if (bo.getRateName() != null && !bo.getRateName().isEmpty()) { + throw new ServiceException("类型为2的模板不能填写名称"); + } + } else if ("1".equals(templateType)) { + if (bo.getRateName() == null || bo.getRateName().isEmpty()) { + throw new ServiceException("类型为1的模板必须填写名称"); + } + } + CommissionSection entity = cn.hutool.core.bean.BeanUtil.toBean(bo, CommissionSection.class); + return baseMapper.insert(entity) > 0; + } + + @Override + public Boolean updateByBo(CommissionSectionBo bo) { + // 1. 查询模板类型 + CommissionTemplate template = templateMapper.selectById(bo.getTemplateId()); + if (template == null) { + throw new ServiceException("分成比例模板不存在"); + } + String templateType = template.getTemplateType(); + // 2. 校验逻辑 + if ("2".equals(templateType)) { + if (bo.getRateName() != null && !bo.getRateName().isEmpty()) { + throw new ServiceException("类型为2的模板不能填写名称"); + } + } else if ("".equals(templateType)) { + if (bo.getRateName() == null || bo.getRateName().isEmpty()) { + throw new ServiceException("类型为1的模板必须填写名称"); + } + } + CommissionSection entity = cn.hutool.core.bean.BeanUtil.toBean(bo, CommissionSection.class); + return baseMapper.updateById(entity) > 0; + } + + @Override + public Boolean deleteWithValidByIds(List ids, Boolean isValid) { + // 可扩展校验逻辑 + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public List queryListByTemplateId(Integer templateId) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(CommissionSection::getTemplateId, templateId); + List list = baseMapper.selectList(lqw); + // 转VO + return list.stream().map(section -> cn.hutool.core.bean.BeanUtil.toBean(section, CommissionSectionVo.class)).toList(); + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionTemplateServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionTemplateServiceImpl.java new file mode 100644 index 000000000..e2cfc96e6 --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/CommissionTemplateServiceImpl.java @@ -0,0 +1,68 @@ +package org.dromara.system.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.common.mybatis.core.page.PageQuery; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.CommissionTemplate; +import org.dromara.system.domain.bo.CommissionTemplateBo; +import org.dromara.system.domain.vo.CommissionTemplateVo; +import org.dromara.system.mapper.CommissionTemplateMapper; +import org.dromara.system.service.ICommissionTemplateService; +import org.springframework.stereotype.Service; +import java.util.List; +import org.dromara.system.mapper.CommissionSectionMapper; +import org.springframework.beans.factory.annotation.Autowired; +import org.dromara.system.domain.CommissionSection; + +/** + * 分成比例模板Service实现 + */ +@RequiredArgsConstructor +@Service +public class CommissionTemplateServiceImpl extends ServiceImpl implements ICommissionTemplateService { + private final CommissionTemplateMapper baseMapper; + + @Autowired + private CommissionSectionMapper commissionSectionMapper; + + @Override + public TableDataInfo queryPageList(CommissionTemplateBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.like(bo.getTemplateName() != null, CommissionTemplate::getTemplateName, bo.getTemplateName()); + lqw.eq(bo.getIsActive() != null, CommissionTemplate::getIsActive, bo.getIsActive()); + Page page = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(page); + } + + @Override + public CommissionTemplateVo queryById(Integer id) { + return baseMapper.selectVoById(id); + } + + @Override + public Boolean insertByBo(CommissionTemplateBo bo) { + CommissionTemplate entity = BeanUtil.toBean(bo, CommissionTemplate.class); + return baseMapper.insert(entity) > 0; + } + + @Override + public Boolean updateByBo(CommissionTemplateBo bo) { + CommissionTemplate entity = BeanUtil.toBean(bo, CommissionTemplate.class); + return baseMapper.updateById(entity) > 0; + } + + @Override + public Boolean deleteWithValidByIds(List ids, Boolean isValid) { + // 先删除所有关联的区间 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(CommissionSection::getTemplateId, ids); + commissionSectionMapper.delete(wrapper); + + // 再删除模板 + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantAccountServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantAccountServiceImpl.java new file mode 100644 index 000000000..a51a7f48b --- /dev/null +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysTenantAccountServiceImpl.java @@ -0,0 +1,61 @@ +package org.dromara.system.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import lombok.RequiredArgsConstructor; +import org.dromara.system.domain.SysTenantAccount; +import org.dromara.system.domain.bo.SysTenantAccountBo; +import org.dromara.system.mapper.SysTenantAccountMapper; +import org.dromara.system.service.ISysTenantAccountService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class SysTenantAccountServiceImpl extends ServiceImpl implements ISysTenantAccountService{ + private final SysTenantAccountMapper mapper; + + @Override + public IPage pageWithTenant(Page page, SysTenantAccountBo bo) { + LambdaQueryWrapper wrapper = buildWrapper(bo); + return mapper.selectPage(page, wrapper); + } + + @Override + public List list(SysTenantAccountBo bo) { + LambdaQueryWrapper wrapper = buildWrapper(bo); + return mapper.selectList(wrapper); + } + + @Override + public SysTenantAccount getById(Long id) { + return mapper.selectById(id); + } + + @Override + public boolean save(SysTenantAccount po) { + return mapper.insert(po) > 0; + } + + @Override + public boolean updateById(SysTenantAccount po) { + return mapper.updateById(po) > 0; + } + + @Override + public boolean removeById(Long id) { + return mapper.deleteById(id) > 0; + } + + private LambdaQueryWrapper buildWrapper(SysTenantAccountBo bo) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (bo == null) return wrapper; + if (bo.getTenantId() != null) wrapper.eq(SysTenantAccount::getTenantId, bo.getTenantId()); + if (bo.getType() != null) wrapper.eq(SysTenantAccount::getType, bo.getType()); + // 可根据实际业务补充更多条件 + return wrapper; + } +}