diff --git a/src/main/java/com/rj/config/MybatisPlusConfig.java b/src/main/java/com/rj/config/MybatisPlusConfig.java new file mode 100644 index 0000000..02ed62a --- /dev/null +++ b/src/main/java/com/rj/config/MybatisPlusConfig.java @@ -0,0 +1,36 @@ +package com.rj.config; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * MyBatis Plus 配置类 + * + * @author 李中华 + * @since 2025-08-08 + */ +@Configuration +@EnableTransactionManagement +public class MybatisPlusConfig { + + /** + * 分页插件配置 + */ + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + + // 分页插件 + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + + // 乐观锁插件 + interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor()); + + return interceptor; + } +} \ No newline at end of file diff --git a/src/main/java/com/rj/config/SqlPerformanceConfig.java b/src/main/java/com/rj/config/SqlPerformanceConfig.java new file mode 100644 index 0000000..2e5b12d --- /dev/null +++ b/src/main/java/com/rj/config/SqlPerformanceConfig.java @@ -0,0 +1,54 @@ +package com.rj.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Profile; +import lombok.extern.slf4j.Slf4j; + +/** + * SQL性能监控配置 + * + * @author 李中华 + * @since 2025-08-08 + */ +@Slf4j +@Configuration +public class SqlPerformanceConfig { + + /** + * SQL执行时间监控 + */ + @Bean + @Profile({"dev", "test"}) + public SqlPerformanceInterceptor sqlPerformanceInterceptor() { + return new SqlPerformanceInterceptor(); + } + + /** + * SQL性能监控拦截器 + */ + public static class SqlPerformanceInterceptor { + + private static final long SLOW_SQL_THRESHOLD = 1000; // 1秒 + + public void beforeExecute(String sql, Object[] params) { + log.info("=== SQL执行开始 ==="); + log.info("SQL: {}", sql); + if (params != null && params.length > 0) { + log.info("参数: {}", java.util.Arrays.toString(params)); + } + } + + public void afterExecute(String sql, long executionTime) { + log.info("SQL执行完成,耗时: {}ms", executionTime); + if (executionTime > SLOW_SQL_THRESHOLD) { + log.warn("⚠️ 慢SQL警告: 执行时间 {}ms 超过阈值 {}ms", executionTime, SLOW_SQL_THRESHOLD); + } + log.info("=== SQL执行结束 ===\n"); + } + + public void onError(String sql, Exception e) { + log.error("SQL执行异常: {}", sql, e); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/rj/controller/sys/MenuController.java b/src/main/java/com/rj/controller/sys/MenuController.java new file mode 100644 index 0000000..528fc4c --- /dev/null +++ b/src/main/java/com/rj/controller/sys/MenuController.java @@ -0,0 +1,307 @@ +package com.rj.controller.sys; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.sys.Menu; +import com.rj.service.sys.IMenuService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 菜单表 前端控制器 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/sys/menu") +@Tag(name = "菜单管理", description = "菜单管理相关接口") +public class MenuController { + + @Autowired + private IMenuService menuService; + + /** + * 新增菜单 + */ + @PostMapping("/add") + @Operation(summary = "新增菜单", description = "添加新的菜单信息") + public ResponseEntity> addMenu( + @Parameter(description = "菜单信息", required = true) + @RequestBody Menu menu) { + Map result = new HashMap<>(); + try { + boolean success = menuService.save(menu); + if (success) { + result.put("success", true); + result.put("message", "菜单添加成功"); + result.put("data", menu); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "菜单添加失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "菜单添加异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据ID查询菜单 + */ + @GetMapping("/get/{id}") + @Operation(summary = "根据ID查询菜单", description = "根据菜单ID获取菜单详细信息") + public ResponseEntity> getMenuById( + @Parameter(description = "菜单ID", required = true) + @PathVariable Integer id) { + Map result = new HashMap<>(); + try { + Menu menu = menuService.getById(id); + if (menu != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", menu); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "菜单不存在"); + return ResponseEntity.notFound().build(); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据菜单名查询菜单 + */ + @GetMapping("/getByName") + @Operation(summary = "根据菜单名查询菜单", description = "根据菜单名查询菜单信息") + public ResponseEntity> getMenuByName( + @Parameter(description = "菜单名", required = true) + @RequestParam String name) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Menu::getName, name); + List menuList = menuService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", menuList); + result.put("count", menuList.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据父菜单ID查询子菜单 + */ + @GetMapping("/getByParentId/{parentId}") + @Operation(summary = "根据父菜单ID查询子菜单", description = "根据父菜单ID查询子菜单信息") + public ResponseEntity> getMenuByParentId( + @Parameter(description = "父菜单ID", required = true) + @PathVariable Integer parentId) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Menu::getParentId, parentId); + List menuList = menuService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", menuList); + result.put("count", menuList.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 分页查询菜单列表 + */ + @GetMapping("/list") + @Operation(summary = "分页查询菜单列表", description = "分页查询菜单信息列表") + public ResponseEntity> getMenuList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "菜单名(模糊查询)") + @RequestParam(required = false) String name, + @Parameter(description = "父菜单ID") + @RequestParam(required = false) Integer parentId) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (name != null && !name.trim().isEmpty()) { + queryWrapper.like(Menu::getName, name); + } + if (parentId != null) { + queryWrapper.eq(Menu::getParentId, parentId); + } + + // 按菜单ID倒序排列 + queryWrapper.orderByDesc(Menu::getMenuId); + + Page menuPage = menuService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", menuPage.getRecords()); + result.put("total", menuPage.getTotal()); + result.put("current", menuPage.getCurrent()); + result.put("size", menuPage.getSize()); + result.put("pages", menuPage.getPages()); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 更新菜单信息 + */ + @PutMapping("/update") + @Operation(summary = "更新菜单信息", description = "更新菜单详细信息") + public ResponseEntity> updateMenu( + @Parameter(description = "菜单信息", required = true) + @RequestBody Menu menu) { + Map result = new HashMap<>(); + try { + if (menu.getMenuId() == null) { + result.put("success", false); + result.put("message", "菜单ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = menuService.updateById(menu); + + if (success) { + result.put("success", true); + result.put("message", "菜单信息更新成功"); + result.put("data", menu); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "菜单信息更新失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "更新异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据ID删除菜单 + */ + @DeleteMapping("/delete/{id}") + @Operation(summary = "删除菜单", description = "根据菜单ID删除菜单信息") + public ResponseEntity> deleteMenu( + @Parameter(description = "菜单ID", required = true) + @PathVariable Integer id) { + Map result = new HashMap<>(); + try { + boolean success = menuService.removeById(id); + if (success) { + result.put("success", true); + result.put("message", "菜单删除成功"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "菜单删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 批量删除菜单 + */ + @DeleteMapping("/batchDelete") + @Operation(summary = "批量删除菜单", description = "根据菜单ID列表批量删除菜单信息") + public ResponseEntity> batchDeleteMenus( + @Parameter(description = "菜单ID列表", required = true) + @RequestBody List ids) { + Map result = new HashMap<>(); + try { + if (ids == null || ids.isEmpty()) { + result.put("success", false); + result.put("message", "菜单ID列表不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = menuService.removeByIds(ids); + if (success) { + result.put("success", true); + result.put("message", "批量删除成功,共删除 " + ids.size() + " 条记录"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "批量删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "批量删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 获取菜单统计信息 + */ + @GetMapping("/statistics") + @Operation(summary = "获取菜单统计信息", description = "获取菜单总数等统计信息") + public ResponseEntity> getMenuStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = menuService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalMenus", totalCount); + + result.put("success", true); + result.put("message", "统计信息获取成功"); + result.put("data", statistics); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "统计信息获取异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } +} diff --git a/src/main/java/com/rj/controller/sys/RoleController.java b/src/main/java/com/rj/controller/sys/RoleController.java new file mode 100644 index 0000000..9682618 --- /dev/null +++ b/src/main/java/com/rj/controller/sys/RoleController.java @@ -0,0 +1,277 @@ +package com.rj.controller.sys; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.sys.Role; +import com.rj.service.sys.IRoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 角色表 前端控制器 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/sys/role") +@Tag(name = "角色管理", description = "角色管理相关接口") +public class RoleController { + + @Autowired + private IRoleService roleService; + + /** + * 新增角色 + */ + @PostMapping("/add") + @Operation(summary = "新增角色", description = "添加新的角色信息") + public ResponseEntity> addRole( + @Parameter(description = "角色信息", required = true) + @RequestBody Role role) { + Map result = new HashMap<>(); + try { + boolean success = roleService.save(role); + if (success) { + result.put("success", true); + result.put("message", "角色添加成功"); + result.put("data", role); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "角色添加失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "角色添加异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据ID查询角色 + */ + @GetMapping("/get/{id}") + @Operation(summary = "根据ID查询角色", description = "根据角色ID获取角色详细信息") + public ResponseEntity> getRoleById( + @Parameter(description = "角色ID", required = true) + @PathVariable Integer id) { + Map result = new HashMap<>(); + try { + Role role = roleService.getById(id); + if (role != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", role); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "角色不存在"); + return ResponseEntity.notFound().build(); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据角色名查询角色 + */ + @GetMapping("/getByRoleName") + @Operation(summary = "根据角色名查询角色", description = "根据角色名查询角色信息") + public ResponseEntity> getRoleByRoleName( + @Parameter(description = "角色名", required = true) + @RequestParam String roleName) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Role::getRoleName, roleName); + List roleList = roleService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", roleList); + result.put("count", roleList.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 分页查询角色列表 + */ + @GetMapping("/list") + @Operation(summary = "分页查询角色列表", description = "分页查询角色信息列表") + public ResponseEntity> getRoleList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "角色名(模糊查询)") + @RequestParam(required = false) String roleName) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (roleName != null && !roleName.trim().isEmpty()) { + queryWrapper.like(Role::getRoleName, roleName); + } + + // 按角色ID倒序排列 + queryWrapper.orderByDesc(Role::getRoleId); + + Page rolePage = roleService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", rolePage.getRecords()); + result.put("total", rolePage.getTotal()); + result.put("current", rolePage.getCurrent()); + result.put("size", rolePage.getSize()); + result.put("pages", rolePage.getPages()); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 更新角色信息 + */ + @PutMapping("/update") + @Operation(summary = "更新角色信息", description = "更新角色详细信息") + public ResponseEntity> updateRole( + @Parameter(description = "角色信息", required = true) + @RequestBody Role role) { + Map result = new HashMap<>(); + try { + if (role.getRoleId() == null) { + result.put("success", false); + result.put("message", "角色ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = roleService.updateById(role); + + if (success) { + result.put("success", true); + result.put("message", "角色信息更新成功"); + result.put("data", role); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "角色信息更新失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "更新异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据ID删除角色 + */ + @DeleteMapping("/delete/{id}") + @Operation(summary = "删除角色", description = "根据角色ID删除角色信息") + public ResponseEntity> deleteRole( + @Parameter(description = "角色ID", required = true) + @PathVariable Integer id) { + Map result = new HashMap<>(); + try { + boolean success = roleService.removeById(id); + if (success) { + result.put("success", true); + result.put("message", "角色删除成功"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "角色删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 批量删除角色 + */ + @DeleteMapping("/batchDelete") + @Operation(summary = "批量删除角色", description = "根据角色ID列表批量删除角色信息") + public ResponseEntity> batchDeleteRoles( + @Parameter(description = "角色ID列表", required = true) + @RequestBody List ids) { + Map result = new HashMap<>(); + try { + if (ids == null || ids.isEmpty()) { + result.put("success", false); + result.put("message", "角色ID列表不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = roleService.removeByIds(ids); + if (success) { + result.put("success", true); + result.put("message", "批量删除成功,共删除 " + ids.size() + " 条记录"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "批量删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "批量删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 获取角色统计信息 + */ + @GetMapping("/statistics") + @Operation(summary = "获取角色统计信息", description = "获取角色总数等统计信息") + public ResponseEntity> getRoleStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = roleService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalRoles", totalCount); + + result.put("success", true); + result.put("message", "统计信息获取成功"); + result.put("data", statistics); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "统计信息获取异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } +} diff --git a/src/main/java/com/rj/controller/sys/UserController.java b/src/main/java/com/rj/controller/sys/UserController.java new file mode 100644 index 0000000..9d4e6b0 --- /dev/null +++ b/src/main/java/com/rj/controller/sys/UserController.java @@ -0,0 +1,282 @@ +package com.rj.controller.sys; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.sys.User; +import com.rj.service.sys.IUserService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 用户表 前端控制器 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/sys/user") +@Tag(name = "用户管理", description = "用户管理相关接口") +public class UserController { + + @Autowired + private IUserService userService; + + /** + * 新增用户 + */ + @PostMapping("/add") + @Operation(summary = "新增用户", description = "添加新的用户信息") + public ResponseEntity> addUser( + @Parameter(description = "用户信息", required = true) + @RequestBody User user) { + Map result = new HashMap<>(); + try { + boolean success = userService.save(user); + if (success) { + result.put("success", true); + result.put("message", "用户添加成功"); + result.put("data", user); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户添加失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "用户添加异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据ID查询用户 + */ + @GetMapping("/get/{id}") + @Operation(summary = "根据ID查询用户", description = "根据用户ID获取用户详细信息") + public ResponseEntity> getUserById( + @Parameter(description = "用户ID", required = true) + @PathVariable Integer id) { + Map result = new HashMap<>(); + try { + User user = userService.getById(id); + if (user != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", user); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户不存在"); + return ResponseEntity.notFound().build(); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据用户名查询用户 + */ + @GetMapping("/getByUserName") + @Operation(summary = "根据用户名查询用户", description = "根据用户名查询用户信息") + public ResponseEntity> getUserByUserName( + @Parameter(description = "用户名", required = true) + @RequestParam String userName) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(User::getUserName, userName); + List userList = userService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", userList); + result.put("count", userList.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 分页查询用户列表 + */ + @GetMapping("/list") + @Operation(summary = "分页查询用户列表", description = "分页查询用户信息列表") + public ResponseEntity> getUserList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "用户名(模糊查询)") + @RequestParam(required = false) String userName, + @Parameter(description = "邮箱(模糊查询)") + @RequestParam(required = false) String email) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (userName != null && !userName.trim().isEmpty()) { + queryWrapper.like(User::getUserName, userName); + } + if (email != null && !email.trim().isEmpty()) { + queryWrapper.like(User::getEmail, email); + } + + // 按用户ID倒序排列 + queryWrapper.orderByDesc(User::getUserId); + + Page userPage = userService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", userPage.getRecords()); + result.put("total", userPage.getTotal()); + result.put("current", userPage.getCurrent()); + result.put("size", userPage.getSize()); + result.put("pages", userPage.getPages()); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 更新用户信息 + */ + @PutMapping("/update") + @Operation(summary = "更新用户信息", description = "更新用户详细信息") + public ResponseEntity> updateUser( + @Parameter(description = "用户信息", required = true) + @RequestBody User user) { + Map result = new HashMap<>(); + try { + if (user.getUserId() == null) { + result.put("success", false); + result.put("message", "用户ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = userService.updateById(user); + + if (success) { + result.put("success", true); + result.put("message", "用户信息更新成功"); + result.put("data", user); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户信息更新失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "更新异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据ID删除用户 + */ + @DeleteMapping("/delete/{id}") + @Operation(summary = "删除用户", description = "根据用户ID删除用户信息") + public ResponseEntity> deleteUser( + @Parameter(description = "用户ID", required = true) + @PathVariable Integer id) { + Map result = new HashMap<>(); + try { + boolean success = userService.removeById(id); + if (success) { + result.put("success", true); + result.put("message", "用户删除成功"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 批量删除用户 + */ + @DeleteMapping("/batchDelete") + @Operation(summary = "批量删除用户", description = "根据用户ID列表批量删除用户信息") + public ResponseEntity> batchDeleteUsers( + @Parameter(description = "用户ID列表", required = true) + @RequestBody List ids) { + Map result = new HashMap<>(); + try { + if (ids == null || ids.isEmpty()) { + result.put("success", false); + result.put("message", "用户ID列表不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = userService.removeByIds(ids); + if (success) { + result.put("success", true); + result.put("message", "批量删除成功,共删除 " + ids.size() + " 条记录"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "批量删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "批量删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 获取用户统计信息 + */ + @GetMapping("/statistics") + @Operation(summary = "获取用户统计信息", description = "获取用户总数等统计信息") + public ResponseEntity> getUserStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = userService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalUsers", totalCount); + + result.put("success", true); + result.put("message", "统计信息获取成功"); + result.put("data", statistics); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "统计信息获取异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } +} diff --git a/src/main/java/com/rj/controller/sys/UserRoleController.java b/src/main/java/com/rj/controller/sys/UserRoleController.java new file mode 100644 index 0000000..a0f5e83 --- /dev/null +++ b/src/main/java/com/rj/controller/sys/UserRoleController.java @@ -0,0 +1,283 @@ +package com.rj.controller.sys; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.sys.UserRole; +import com.rj.service.sys.IUserRoleService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 用户角色关联表 前端控制器 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/sys/userRole") +@Tag(name = "用户角色管理", description = "用户角色关联管理相关接口") +public class UserRoleController { + + @Autowired + private IUserRoleService userRoleService; + + /** + * 新增用户角色关联 + */ + @PostMapping("/add") + @Operation(summary = "新增用户角色关联", description = "添加新的用户角色关联信息") + public ResponseEntity> addUserRole( + @Parameter(description = "用户角色关联信息", required = true) + @RequestBody UserRole userRole) { + Map result = new HashMap<>(); + try { + boolean success = userRoleService.save(userRole); + if (success) { + result.put("success", true); + result.put("message", "用户角色关联添加成功"); + result.put("data", userRole); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户角色关联添加失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "用户角色关联添加异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据用户ID查询用户角色关联 + */ + @GetMapping("/getByUserId/{userId}") + @Operation(summary = "根据用户ID查询用户角色关联", description = "根据用户ID获取用户角色关联信息") + public ResponseEntity> getUserRoleByUserId( + @Parameter(description = "用户ID", required = true) + @PathVariable Integer userId) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserRole::getUserId, userId); + List userRoleList = userRoleService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", userRoleList); + result.put("count", userRoleList.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 根据角色ID查询用户角色关联 + */ + @GetMapping("/getByRoleId/{roleId}") + @Operation(summary = "根据角色ID查询用户角色关联", description = "根据角色ID获取用户角色关联信息") + public ResponseEntity> getUserRoleByRoleId( + @Parameter(description = "角色ID", required = true) + @PathVariable Integer roleId) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserRole::getRoleId, roleId); + List userRoleList = userRoleService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", userRoleList); + result.put("count", userRoleList.size()); + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 分页查询用户角色关联列表 + */ + @GetMapping("/list") + @Operation(summary = "分页查询用户角色关联列表", description = "分页查询用户角色关联信息列表") + public ResponseEntity> getUserRoleList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "用户ID") + @RequestParam(required = false) Integer userId, + @Parameter(description = "角色ID") + @RequestParam(required = false) Integer roleId) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (userId != null) { + queryWrapper.eq(UserRole::getUserId, userId); + } + if (roleId != null) { + queryWrapper.eq(UserRole::getRoleId, roleId); + } + + // 按用户ID和角色ID排序 + queryWrapper.orderByAsc(UserRole::getUserId).orderByAsc(UserRole::getRoleId); + + Page userRolePage = userRoleService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", userRolePage.getRecords()); + result.put("total", userRolePage.getTotal()); + result.put("current", userRolePage.getCurrent()); + result.put("size", userRolePage.getSize()); + result.put("pages", userRolePage.getPages()); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "查询异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 更新用户角色关联信息 + */ + @PutMapping("/update") + @Operation(summary = "更新用户角色关联信息", description = "更新用户角色关联详细信息") + public ResponseEntity> updateUserRole( + @Parameter(description = "用户角色关联信息", required = true) + @RequestBody UserRole userRole) { + Map result = new HashMap<>(); + try { + if (userRole.getUserId() == null || userRole.getRoleId() == null) { + result.put("success", false); + result.put("message", "用户ID和角色ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = userRoleService.updateById(userRole); + + if (success) { + result.put("success", true); + result.put("message", "用户角色关联信息更新成功"); + result.put("data", userRole); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户角色关联信息更新失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "更新异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 删除用户角色关联 + */ + @DeleteMapping("/delete") + @Operation(summary = "删除用户角色关联", description = "根据用户ID和角色ID删除用户角色关联信息") + public ResponseEntity> deleteUserRole( + @Parameter(description = "用户ID", required = true) + @RequestParam Integer userId, + @Parameter(description = "角色ID", required = true) + @RequestParam Integer roleId) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(UserRole::getUserId, userId).eq(UserRole::getRoleId, roleId); + boolean success = userRoleService.remove(queryWrapper); + if (success) { + result.put("success", true); + result.put("message", "用户角色关联删除成功"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "用户角色关联删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 批量删除用户角色关联 + */ + @DeleteMapping("/batchDelete") + @Operation(summary = "批量删除用户角色关联", description = "根据用户角色关联列表批量删除") + public ResponseEntity> batchDeleteUserRoles( + @Parameter(description = "用户角色关联列表", required = true) + @RequestBody List userRoles) { + Map result = new HashMap<>(); + try { + if (userRoles == null || userRoles.isEmpty()) { + result.put("success", false); + result.put("message", "用户角色关联列表不能为空"); + return ResponseEntity.badRequest().body(result); + } + + boolean success = userRoleService.removeByIds(userRoles); + if (success) { + result.put("success", true); + result.put("message", "批量删除成功,共删除 " + userRoles.size() + " 条记录"); + return ResponseEntity.ok(result); + } else { + result.put("success", false); + result.put("message", "批量删除失败"); + return ResponseEntity.badRequest().body(result); + } + } catch (Exception e) { + result.put("success", false); + result.put("message", "批量删除异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } + + /** + * 获取用户角色关联统计信息 + */ + @GetMapping("/statistics") + @Operation(summary = "获取用户角色关联统计信息", description = "获取用户角色关联总数等统计信息") + public ResponseEntity> getUserRoleStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = userRoleService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalUserRoles", totalCount); + + result.put("success", true); + result.put("message", "统计信息获取成功"); + result.put("data", statistics); + + return ResponseEntity.ok(result); + } catch (Exception e) { + result.put("success", false); + result.put("message", "统计信息获取异常:" + e.getMessage()); + return ResponseEntity.internalServerError().body(result); + } + } +} diff --git a/src/main/java/com/rj/entity/sys/Menu.java b/src/main/java/com/rj/entity/sys/Menu.java new file mode 100644 index 0000000..d2af7df --- /dev/null +++ b/src/main/java/com/rj/entity/sys/Menu.java @@ -0,0 +1,56 @@ +package com.rj.entity.sys; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 菜单表 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("menu") +@Schema(description="菜单表") +public class Menu implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "菜单编号") + @TableId("menu_id") + private Integer menuId; + + @Schema(description = "菜单名称") + @TableField("name") + private String name; + + @Schema(description = "重定向路径") + @TableField("redirect") + private String redirect; + + @Schema(description = "路由路径") + @TableField("path") + private String path; + + @Schema(description = "组件路径") + @TableField("component") + private String component; + + @Schema(description = "父菜单ID") + @TableField("parent_id") + private Integer parentId; + + @Schema(description = "元数据信息(JSON格式)") + @TableField("meta") + private String meta; + +} diff --git a/src/main/java/com/rj/entity/sys/Meta.java b/src/main/java/com/rj/entity/sys/Meta.java new file mode 100644 index 0000000..b97c30c --- /dev/null +++ b/src/main/java/com/rj/entity/sys/Meta.java @@ -0,0 +1,56 @@ +package com.rj.entity.sys; + +import java.util.List; + +public class Meta { + + private String title; + private String icon; + private List roles; + private Boolean affix; + + public Meta() { + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public Boolean getAffix() { + return affix; + } + + public void setAffix(Boolean affix) { + this.affix = affix; + } + + @Override + public String toString() { + return "Meta{" + + "title='" + title + '\'' + + ", icon='" + icon + '\'' + + ", roles=" + roles + + ", affix=" + affix + + '}'; + } +} diff --git a/src/main/java/com/rj/entity/sys/Role.java b/src/main/java/com/rj/entity/sys/Role.java new file mode 100644 index 0000000..49234e0 --- /dev/null +++ b/src/main/java/com/rj/entity/sys/Role.java @@ -0,0 +1,36 @@ +package com.rj.entity.sys; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 角色表 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("role") +@Schema(description="角色表") +public class Role implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "角色编号") + @TableId("role_id") + private Integer roleId; + + @Schema(description = "角色名称") + @TableField("role_name") + private String roleName; + +} diff --git a/src/main/java/com/rj/entity/sys/User.java b/src/main/java/com/rj/entity/sys/User.java new file mode 100644 index 0000000..e71235d --- /dev/null +++ b/src/main/java/com/rj/entity/sys/User.java @@ -0,0 +1,52 @@ +package com.rj.entity.sys; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 用户表 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("user") +@Schema(description="用户表") +public class User implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "用户编号") + @TableId("user_id") + private Integer userId; + + @Schema(description = "用户名称") + @TableField("user_name") + private String userName; + + @Schema(description = "邮箱") + @TableField("email") + private String email; + + @Schema(description = "密码") + @TableField("password") + private String password; + + @Schema(description = "token令牌") + @TableField("token") + private String token; + + @Schema(description = "头像") + @TableField("avatar") + private String avatar; + +} diff --git a/src/main/java/com/rj/entity/sys/UserRole.java b/src/main/java/com/rj/entity/sys/UserRole.java new file mode 100644 index 0000000..329332f --- /dev/null +++ b/src/main/java/com/rj/entity/sys/UserRole.java @@ -0,0 +1,36 @@ +package com.rj.entity.sys; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableField; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + *

+ * 用户角色关联表 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@TableName("user_role") +@Schema(description="用户角色关联表") +public class UserRole implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "用户编号") + @TableId("user_id") + private Integer userId; + + @Schema(description = "角色编号") + @TableId("role_id") + private Integer roleId; + +} diff --git a/src/main/java/com/rj/entity/sys/sysmysql.sql b/src/main/java/com/rj/entity/sys/sysmysql.sql new file mode 100644 index 0000000..23d2a95 --- /dev/null +++ b/src/main/java/com/rj/entity/sys/sysmysql.sql @@ -0,0 +1,45 @@ +-- 数据库表结构创建语句 +-- 根据实体类 Menu.java, Role.java, User.java, UserRole.java 生成 + +-- 1. 用户表 (user) +CREATE TABLE `user` ( + `user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', + `user_name` varchar(255) DEFAULT NULL COMMENT '用户名称', + `email` varchar(255) DEFAULT NULL COMMENT '邮箱', + `password` varchar(255) DEFAULT NULL COMMENT '密码', + `token` varchar(255) DEFAULT NULL COMMENT 'token令牌', + `avatar` varchar(255) DEFAULT NULL COMMENT '头像', + PRIMARY KEY (`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表'; + +-- 2. 角色表 (role) +CREATE TABLE `role` ( + `role_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '角色编号', + `role_name` varchar(255) DEFAULT NULL COMMENT '角色名称', + PRIMARY KEY (`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色表'; + +-- 3. 用户角色关联表 (user_role) +CREATE TABLE `user_role` ( + `user_id` int(11) NOT NULL COMMENT '用户编号', + `role_id` int(11) NOT NULL COMMENT '角色编号', + PRIMARY KEY (`user_id`, `role_id`), + KEY `fk_user_role_user_id` (`user_id`), + KEY `fk_user_role_role_id` (`role_id`), + CONSTRAINT `fk_user_role_user_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE CASCADE, + CONSTRAINT `fk_user_role_role_id` FOREIGN KEY (`role_id`) REFERENCES `role` (`role_id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户角色关联表'; + +-- 4. 菜单表 (menu) +CREATE TABLE `menu` ( + `menu_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单编号', + `name` varchar(255) DEFAULT NULL COMMENT '菜单名称', + `redirect` varchar(255) DEFAULT NULL COMMENT '重定向路径', + `path` varchar(255) DEFAULT NULL COMMENT '路由路径', + `component` varchar(255) DEFAULT NULL COMMENT '组件路径', + `parent_id` int(11) DEFAULT NULL COMMENT '父菜单ID', + `meta` json DEFAULT NULL COMMENT '元数据信息(JSON格式)', + PRIMARY KEY (`menu_id`), + KEY `idx_menu_parent_id` (`parent_id`), + CONSTRAINT `fk_menu_parent_id` FOREIGN KEY (`parent_id`) REFERENCES `menu` (`menu_id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='菜单表'; diff --git a/src/main/java/com/rj/mapper/sys/MenuMapper.java b/src/main/java/com/rj/mapper/sys/MenuMapper.java new file mode 100644 index 0000000..be8f37e --- /dev/null +++ b/src/main/java/com/rj/mapper/sys/MenuMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper.sys; + +import com.rj.entity.sys.Menu; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 菜单表 Mapper 接口 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface MenuMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/sys/RoleMapper.java b/src/main/java/com/rj/mapper/sys/RoleMapper.java new file mode 100644 index 0000000..2bcc043 --- /dev/null +++ b/src/main/java/com/rj/mapper/sys/RoleMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper.sys; + +import com.rj.entity.sys.Role; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 角色表 Mapper 接口 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface RoleMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/sys/UserMapper.java b/src/main/java/com/rj/mapper/sys/UserMapper.java new file mode 100644 index 0000000..5d81c82 --- /dev/null +++ b/src/main/java/com/rj/mapper/sys/UserMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper.sys; + +import com.rj.entity.sys.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 用户表 Mapper 接口 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface UserMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/sys/UserRoleMapper.java b/src/main/java/com/rj/mapper/sys/UserRoleMapper.java new file mode 100644 index 0000000..7a2ab7e --- /dev/null +++ b/src/main/java/com/rj/mapper/sys/UserRoleMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper.sys; + +import com.rj.entity.sys.UserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 用户角色关联表 Mapper 接口 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface UserRoleMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/service/sys/IMenuService.java b/src/main/java/com/rj/service/sys/IMenuService.java new file mode 100644 index 0000000..dc1cb1c --- /dev/null +++ b/src/main/java/com/rj/service/sys/IMenuService.java @@ -0,0 +1,16 @@ +package com.rj.service.sys; + +import com.rj.entity.sys.Menu; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 菜单表 服务类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface IMenuService extends IService { + +} diff --git a/src/main/java/com/rj/service/sys/IRoleService.java b/src/main/java/com/rj/service/sys/IRoleService.java new file mode 100644 index 0000000..b233077 --- /dev/null +++ b/src/main/java/com/rj/service/sys/IRoleService.java @@ -0,0 +1,16 @@ +package com.rj.service.sys; + +import com.rj.entity.sys.Role; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 角色表 服务类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface IRoleService extends IService { + +} diff --git a/src/main/java/com/rj/service/sys/IUserRoleService.java b/src/main/java/com/rj/service/sys/IUserRoleService.java new file mode 100644 index 0000000..16ece2f --- /dev/null +++ b/src/main/java/com/rj/service/sys/IUserRoleService.java @@ -0,0 +1,16 @@ +package com.rj.service.sys; + +import com.rj.entity.sys.UserRole; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 用户角色关联表 服务类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface IUserRoleService extends IService { + +} diff --git a/src/main/java/com/rj/service/sys/IUserService.java b/src/main/java/com/rj/service/sys/IUserService.java new file mode 100644 index 0000000..50d8392 --- /dev/null +++ b/src/main/java/com/rj/service/sys/IUserService.java @@ -0,0 +1,16 @@ +package com.rj.service.sys; + +import com.rj.entity.sys.User; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 用户表 服务类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +public interface IUserService extends IService { + +} diff --git a/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java b/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java new file mode 100644 index 0000000..4ace972 --- /dev/null +++ b/src/main/java/com/rj/service/sys/impl/MenuServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.sys.impl; + +import com.rj.entity.sys.Menu; +import com.rj.mapper.sys.MenuMapper; +import com.rj.service.sys.IMenuService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 菜单表 服务实现类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Service +public class MenuServiceImpl extends ServiceImpl implements IMenuService { + +} diff --git a/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java b/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java new file mode 100644 index 0000000..0438b04 --- /dev/null +++ b/src/main/java/com/rj/service/sys/impl/RoleServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.sys.impl; + +import com.rj.entity.sys.Role; +import com.rj.mapper.sys.RoleMapper; +import com.rj.service.sys.IRoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 角色表 服务实现类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Service +public class RoleServiceImpl extends ServiceImpl implements IRoleService { + +} diff --git a/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java b/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java new file mode 100644 index 0000000..1a19202 --- /dev/null +++ b/src/main/java/com/rj/service/sys/impl/UserRoleServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.sys.impl; + +import com.rj.entity.sys.UserRole; +import com.rj.mapper.sys.UserRoleMapper; +import com.rj.service.sys.IUserRoleService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 用户角色关联表 服务实现类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Service +public class UserRoleServiceImpl extends ServiceImpl implements IUserRoleService { + +} diff --git a/src/main/java/com/rj/service/sys/impl/UserServiceImpl.java b/src/main/java/com/rj/service/sys/impl/UserServiceImpl.java new file mode 100644 index 0000000..3722d69 --- /dev/null +++ b/src/main/java/com/rj/service/sys/impl/UserServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.sys.impl; + +import com.rj.entity.sys.User; +import com.rj.mapper.sys.UserMapper; +import com.rj.service.sys.IUserService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 用户表 服务实现类 + *

+ * + * @author 系统生成 + * @since 2025-08-07 + */ +@Service +public class UserServiceImpl extends ServiceImpl implements IUserService { + +} diff --git a/src/main/resources/mapper/sys/MenuMapper.xml b/src/main/resources/mapper/sys/MenuMapper.xml new file mode 100644 index 0000000..a0ea663 --- /dev/null +++ b/src/main/resources/mapper/sys/MenuMapper.xml @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + menu_id, name, redirect, path, component, parent_id, meta + + + diff --git a/src/main/resources/mapper/sys/RoleMapper.xml b/src/main/resources/mapper/sys/RoleMapper.xml new file mode 100644 index 0000000..9075b40 --- /dev/null +++ b/src/main/resources/mapper/sys/RoleMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + role_id, role_name + + + diff --git a/src/main/resources/mapper/sys/UserMapper.xml b/src/main/resources/mapper/sys/UserMapper.xml new file mode 100644 index 0000000..51c271b --- /dev/null +++ b/src/main/resources/mapper/sys/UserMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + user_id, user_name, email, password, token, avatar + + + diff --git a/src/main/resources/mapper/sys/UserRoleMapper.xml b/src/main/resources/mapper/sys/UserRoleMapper.xml new file mode 100644 index 0000000..644c7c4 --- /dev/null +++ b/src/main/resources/mapper/sys/UserRoleMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + user_id, role_id + + + diff --git a/src/main/sql/audio_management.sql b/src/main/sql/audio_management.sql new file mode 100644 index 0000000..e72a4b0 --- /dev/null +++ b/src/main/sql/audio_management.sql @@ -0,0 +1,75 @@ +-- 录音管理 +CREATE TABLE `audio_management` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `recording_name` VARCHAR(100) NOT NULL COMMENT '录音名称', + `recording_time` DATETIME COMMENT '录音时间', + `sales_id` CHAR(36) COMMENT '所属销售ID', + `sales_name` VARCHAR(100) COMMENT '所属销售名称', + `duration` DECIMAL(10,2) DEFAULT 0 COMMENT '录音时长(分钟)', + `customer_id` CHAR(36) COMMENT '客户ID', + `customer_name` VARCHAR(100) COMMENT '客户姓名', + `customer_phone` VARCHAR(50) COMMENT '客户手机号', + `upload_time` DATETIME COMMENT '上传时间', + `intention_level` VARCHAR(50) COMMENT '意向级别(高意向, 中意向 , 低意向)', + `dealership_id` CHAR(36) COMMENT '所属门店ID', + `dealership_name` VARCHAR(100) COMMENT '所属门店名称', + `project_id` CHAR(36) COMMENT '所属项目ID', + `project_name` VARCHAR(100) COMMENT '所属项目名称', + `script_model` VARCHAR(100) COMMENT '话术模型', + `upload_status` VARCHAR(50) COMMENT '上传状态', + `sync_status` VARCHAR(50) COMMENT '同步状态', + `is_merged` TINYINT(1) DEFAULT 0 COMMENT '是否合并(0否1是)', + `remarks` VARCHAR(255) COMMENT '录音备注', + `company_type` VARCHAR(50) COMMENT '公司类型', + `edit_status` VARCHAR(50) COMMENT '编辑状态', + `edit_time` DATETIME COMMENT '编辑时间', + `info_card_type` VARCHAR(50) COMMENT '信息卡类型(如意向车型、购买情况、来访目的、试驾结果、付款方式、试驾专员等)', + `info_card_value` VARCHAR(100) COMMENT '信息卡内容', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='录音管理表,含信息卡字段'; + +-- 视频管理 +CREATE TABLE `video_management` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `video_name` VARCHAR(100) NOT NULL COMMENT '视频名称', + `dealership_id` CHAR(36) COMMENT '所属门店ID', + `dealership_name` VARCHAR(100) COMMENT '所属门店名称', + `sales_id` CHAR(36) COMMENT '所属销售ID', + `sales_name` VARCHAR(100) COMMENT '所属销售名称', + `customer_id` CHAR(36) COMMENT '客户ID', + `customer_name` VARCHAR(100) COMMENT '客户姓名', + `customer_phone` VARCHAR(50) COMMENT '客户手机号', + `duration` DECIMAL(10,2) DEFAULT 0 COMMENT '视频时长(分钟)', + `record_time` DATETIME COMMENT '录制时间', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='视频管理表'; + + + + +CREATE TABLE `device_management` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `device_code` VARCHAR(100) NOT NULL COMMENT '设备编号', + `dealership_id` CHAR(36) COMMENT '所属门店ID', + `dealership_name` VARCHAR(100) COMMENT '所属门店名称', + `last_online_time` DATETIME COMMENT '最近联网时间', + `last_power_on_time` DATETIME COMMENT '最近开机时间', + `last_power_off_time` DATETIME COMMENT '最近关机时间', + `wifi_name` VARCHAR(100) COMMENT 'WIFI名称', + `unuploaded_count` INT DEFAULT 0 COMMENT '未上传数量', + `storage_size` VARCHAR(50) COMMENT '空间大小(M)', + `storage_used` VARCHAR(50) COMMENT '已用空间(M)', + `remaining_battery` VARCHAR(20) COMMENT '剩余电量', + `charging_status` VARCHAR(20) COMMENT '充电状态', + `bind_user_id` CHAR(36) COMMENT '绑定用户ID', + `bind_user_name` VARCHAR(100) COMMENT '绑定用户名称', + `project_id` CHAR(36) COMMENT '所属项目ID', + `project_name` VARCHAR(100) COMMENT '所属项目名称', + `bind_status` TINYINT(1) DEFAULT 0 COMMENT '绑定状态(1已绑定 0未绑定)', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='设备管理表'; + + diff --git a/src/main/sql/dealership.sql b/src/main/sql/dealership.sql new file mode 100644 index 0000000..6f1eea8 --- /dev/null +++ b/src/main/sql/dealership.sql @@ -0,0 +1,100 @@ + +-- 经销商门店管理 +CREATE TABLE `dealership` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `dealership_name` VARCHAR(100) NOT NULL COMMENT '经销商名称', + `dealership_code` VARCHAR(50) NOT NULL COMMENT '经销商代码', + `remaining_hours` DECIMAL(10,2) DEFAULT 0 COMMENT '剩余时长(小时)', + `sales_count` INT DEFAULT 0 COMMENT '销售人员数量', + `avg_recordings` INT DEFAULT 0 COMMENT '人均录音条数', + `avg_recording_duration` DECIMAL(10,2) DEFAULT 0 COMMENT '平均录音时长(分钟)', + `region` VARCHAR(50) COMMENT '地区', + `group_name` VARCHAR(50) COMMENT '分组', + `language` VARCHAR(50) COMMENT '语言', + `dealership_type` VARCHAR(50) COMMENT '经销商类型', + `status` TINYINT(1) DEFAULT 1 COMMENT '状态(1正常 0停用)', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='汽车经销商门店信息表'; + + + +-- 项目管理 +CREATE TABLE `project_management` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `dealership_id` CHAR(36) NOT NULL COMMENT '所属经销商ID', + `project_name` VARCHAR(100) NOT NULL COMMENT '项目名称', + `script_version` INT DEFAULT 1 COMMENT '话术版本', + `script_publish_time` DATETIME COMMENT '话术发布时间', + `salesperson_count` INT DEFAULT 0 COMMENT '销售人员数量', + `avg_recording_duration` DECIMAL(10,2) DEFAULT 0 COMMENT '平均录音时长(分钟)', + `step` VARCHAR(100) COMMENT '步骤', + `group_name` VARCHAR(50) COMMENT '分组', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `description` VARCHAR(255) COMMENT '项目描述', + `status` TINYINT(1) DEFAULT 1 COMMENT '项目状态(1启用 0停用)', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='项目管理表'; + + +-- 销售管理 +CREATE TABLE `sales_management` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `sales_name` VARCHAR(100) NOT NULL COMMENT '销售名称', + `login_account` VARCHAR(100) NOT NULL COMMENT '登录账号', + `recording_count` INT DEFAULT 0 COMMENT '录音数', + `avg_recording_duration` DECIMAL(10,2) DEFAULT 0 COMMENT '平均录音时间(分钟)', + `total_recording_hours` DECIMAL(10,2) DEFAULT 0 COMMENT '录音总时长(小时)', + `project_id` CHAR(36) COMMENT '所属项目ID', + `project_name` VARCHAR(100) COMMENT '所属项目名称', + `dealership_id` CHAR(36) COMMENT '所属门店ID', + `dealership_name` VARCHAR(100) COMMENT '所属门店名称', + `role` VARCHAR(50) COMMENT '角色', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `last_recording_time` DATETIME COMMENT '最近录音时间', + `last_login_time` DATETIME COMMENT '最后登录时间', + `last_login_ip` VARCHAR(50) COMMENT '最后登录IP', + `status` TINYINT(1) DEFAULT 1 COMMENT '销售状态(1启用 0停用)', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='销售管理表'; + + +-- 客户管理 +CREATE TABLE `customer_management` ( + `id` CHAR(36) PRIMARY KEY COMMENT '主键,UUID', + `customer_name` VARCHAR(100) NOT NULL COMMENT '客户姓名', + `contact` VARCHAR(50) COMMENT '联系方式', + `dealership_id` CHAR(36) COMMENT '所属门店ID', + `dealership_name` VARCHAR(100) COMMENT '所属门店名称', + `sales_id` CHAR(36) COMMENT '所属销售ID', + `sales_name` VARCHAR(100) COMMENT '所属销售名称', + `recording_count` INT DEFAULT 0 COMMENT '录音条数', + `intended_model` VARCHAR(100) COMMENT '意向车型', + `info_card` VARCHAR(100) COMMENT '信息卡', + `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户管理表'; + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/test/java/com/rj/service/AudioManagementServiceTest.java b/src/test/java/com/rj/service/AudioManagementServiceTest.java new file mode 100644 index 0000000..8e2efcf --- /dev/null +++ b/src/test/java/com/rj/service/AudioManagementServiceTest.java @@ -0,0 +1,337 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.AudioManagement; +import com.rj.service.impl.AudioManagementServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class AudioManagementServiceTest { + + @Autowired + private IAudioManagementService audioManagementService; + + @Test + void testSaveAudioManagement() { + // 创建测试数据 + AudioManagement audioManagement = new AudioManagement(); + audioManagement.setRecordingName("测试录音"); + audioManagement.setRecordingTime(LocalDateTime.now()); + audioManagement.setSalesId("SALES001"); + audioManagement.setSalesName("张三"); + audioManagement.setDuration(new BigDecimal("15.5")); + audioManagement.setCustomerId("CUST001"); + audioManagement.setCustomerName("李四"); + audioManagement.setCustomerPhone("13800138000"); + audioManagement.setUploadTime(LocalDateTime.now()); + audioManagement.setIntentionLevel("高意向"); + audioManagement.setDealershipId("DEAL001"); + audioManagement.setDealershipName("北京4S店"); + audioManagement.setProjectId("PROJ001"); + audioManagement.setProjectName("奥迪A6L项目"); + audioManagement.setScriptModel("标准话术"); + audioManagement.setUploadStatus("已上传"); + audioManagement.setSyncStatus("已同步"); + audioManagement.setIsMerged(false); + audioManagement.setRemarks("测试录音备注"); + audioManagement.setCompanyType("4S店"); + audioManagement.setEditStatus("未编辑"); + audioManagement.setInfoCardType("意向车型"); + audioManagement.setInfoCarddescription("奥迪A6L 2.0T"); + audioManagement.setCreateTime(LocalDateTime.now()); + audioManagement.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = audioManagementService.save(audioManagement); + + // 验证保存成功 + assertTrue(result); + assertNotNull(audioManagement.getId()); + } + + @Test + void testGetAudioManagementById() { + // 先保存一条测试数据 + AudioManagement audioManagement = new AudioManagement(); + audioManagement.setRecordingName("查询测试录音"); + audioManagement.setRecordingTime(LocalDateTime.now()); + audioManagement.setSalesId("SALES002"); + audioManagement.setSalesName("王五"); + audioManagement.setDuration(new BigDecimal("20.0")); + audioManagement.setCustomerId("CUST002"); + audioManagement.setCustomerName("赵六"); + audioManagement.setCustomerPhone("13900139000"); + audioManagement.setUploadTime(LocalDateTime.now()); + audioManagement.setIntentionLevel("中意向"); + audioManagement.setDealershipId("DEAL002"); + audioManagement.setDealershipName("上海4S店"); + audioManagement.setProjectId("PROJ002"); + audioManagement.setProjectName("宝马5系项目"); + audioManagement.setScriptModel("高级话术"); + audioManagement.setUploadStatus("已上传"); + audioManagement.setSyncStatus("已同步"); + audioManagement.setIsMerged(false); + audioManagement.setRemarks("查询测试录音备注"); + audioManagement.setCompanyType("4S店"); + audioManagement.setEditStatus("未编辑"); + audioManagement.setInfoCardType("购买情况"); + audioManagement.setInfoCarddescription("首次购买"); + audioManagement.setCreateTime(LocalDateTime.now()); + audioManagement.setUpdateTime(LocalDateTime.now()); + + audioManagementService.save(audioManagement); + + // 测试根据ID查询功能 + AudioManagement foundAudio = audioManagementService.getById(audioManagement.getId()); + + // 验证查询结果 + assertNotNull(foundAudio); + assertEquals("查询测试录音", foundAudio.getRecordingName()); + assertEquals("王五", foundAudio.getSalesName()); + assertEquals("赵六", foundAudio.getCustomerName()); + assertEquals("13900139000", foundAudio.getCustomerPhone()); + } + + @Test + void testGetAudioManagementByCustomerPhone() { + // 先保存一条测试数据 + AudioManagement audioManagement = new AudioManagement(); + audioManagement.setRecordingName("手机号查询测试"); + audioManagement.setRecordingTime(LocalDateTime.now()); + audioManagement.setSalesId("SALES003"); + audioManagement.setSalesName("孙七"); + audioManagement.setDuration(new BigDecimal("25.5")); + audioManagement.setCustomerId("CUST003"); + audioManagement.setCustomerName("周八"); + audioManagement.setCustomerPhone("13700137000"); + audioManagement.setUploadTime(LocalDateTime.now()); + audioManagement.setIntentionLevel("低意向"); + audioManagement.setDealershipId("DEAL003"); + audioManagement.setDealershipName("广州4S店"); + audioManagement.setProjectId("PROJ003"); + audioManagement.setProjectName("奔驰E级项目"); + audioManagement.setScriptModel("基础话术"); + audioManagement.setUploadStatus("已上传"); + audioManagement.setSyncStatus("已同步"); + audioManagement.setIsMerged(false); + audioManagement.setRemarks("手机号查询测试备注"); + audioManagement.setCompanyType("4S店"); + audioManagement.setEditStatus("未编辑"); + audioManagement.setInfoCardType("来访目的"); + audioManagement.setInfoCarddescription("了解车型"); + audioManagement.setCreateTime(LocalDateTime.now()); + audioManagement.setUpdateTime(LocalDateTime.now()); + + audioManagementService.save(audioManagement); + + // 测试根据客户手机号查询功能 + List audioList = audioManagementService.lambdaQuery() + .eq(AudioManagement::getCustomerPhone, "13700137000") + .list(); + + // 验证查询结果 + assertNotNull(audioList); + assertFalse(audioList.isEmpty()); + assertEquals("手机号查询测试", audioList.get(0).getRecordingName()); + assertEquals("13700137000", audioList.get(0).getCustomerPhone()); + assertEquals("周八", audioList.get(0).getCustomerName()); + } + + @Test + void testGetAudioManagementByCustomerPhoneWithNoResults() { + // 测试查询不存在的手机号 + List audioList = audioManagementService.lambdaQuery() + .eq(AudioManagement::getCustomerPhone, "00000000000") + .list(); + + // 验证查询结果为空 + assertNotNull(audioList); + assertTrue(audioList.isEmpty()); + } + + @Test + void testUpdateAudioManagement() { + // 先保存一条测试数据 + AudioManagement audioManagement = new AudioManagement(); + audioManagement.setRecordingName("更新测试录音"); + audioManagement.setRecordingTime(LocalDateTime.now()); + audioManagement.setSalesId("SALES004"); + audioManagement.setSalesName("吴九"); + audioManagement.setDuration(new BigDecimal("30.0")); + audioManagement.setCustomerId("CUST004"); + audioManagement.setCustomerName("郑十"); + audioManagement.setCustomerPhone("13600136000"); + audioManagement.setUploadTime(LocalDateTime.now()); + audioManagement.setIntentionLevel("高意向"); + audioManagement.setDealershipId("DEAL004"); + audioManagement.setDealershipName("深圳4S店"); + audioManagement.setProjectId("PROJ004"); + audioManagement.setProjectName("雷克萨斯ES项目"); + audioManagement.setScriptModel("专业话术"); + audioManagement.setUploadStatus("已上传"); + audioManagement.setSyncStatus("已同步"); + audioManagement.setIsMerged(false); + audioManagement.setRemarks("更新测试录音备注"); + audioManagement.setCompanyType("4S店"); + audioManagement.setEditStatus("未编辑"); + audioManagement.setInfoCardType("试驾结果"); + audioManagement.setInfoCarddescription("满意"); + audioManagement.setCreateTime(LocalDateTime.now()); + audioManagement.setUpdateTime(LocalDateTime.now()); + + audioManagementService.save(audioManagement); + + // 更新录音信息 + audioManagement.setRemarks("已更新的备注信息"); + audioManagement.setIntentionLevel("中意向"); + audioManagement.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = audioManagementService.updateById(audioManagement); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + AudioManagement updatedAudio = audioManagementService.getById(audioManagement.getId()); + assertEquals("已更新的备注信息", updatedAudio.getRemarks()); + assertEquals("中意向", updatedAudio.getIntentionLevel()); + } + + @Test + void testDeleteAudioManagement() { + // 先保存一条测试数据 + AudioManagement audioManagement = new AudioManagement(); + audioManagement.setRecordingName("删除测试录音"); + audioManagement.setRecordingTime(LocalDateTime.now()); + audioManagement.setSalesId("SALES005"); + audioManagement.setSalesName("钱十一"); + audioManagement.setDuration(new BigDecimal("18.5")); + audioManagement.setCustomerId("CUST005"); + audioManagement.setCustomerName("孙十二"); + audioManagement.setCustomerPhone("13500135000"); + audioManagement.setUploadTime(LocalDateTime.now()); + audioManagement.setIntentionLevel("高意向"); + audioManagement.setDealershipId("DEAL005"); + audioManagement.setDealershipName("杭州4S店"); + audioManagement.setProjectId("PROJ005"); + audioManagement.setProjectName("沃尔沃S90项目"); + audioManagement.setScriptModel("标准话术"); + audioManagement.setUploadStatus("已上传"); + audioManagement.setSyncStatus("已同步"); + audioManagement.setIsMerged(false); + audioManagement.setRemarks("删除测试录音备注"); + audioManagement.setCompanyType("4S店"); + audioManagement.setEditStatus("未编辑"); + audioManagement.setInfoCardType("付款方式"); + audioManagement.setInfoCarddescription("全款"); + audioManagement.setCreateTime(LocalDateTime.now()); + audioManagement.setUpdateTime(LocalDateTime.now()); + + audioManagementService.save(audioManagement); + String audioId = audioManagement.getId(); + + // 测试删除功能 + boolean result = audioManagementService.removeById(audioId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + AudioManagement deletedAudio = audioManagementService.getById(audioId); + assertNull(deletedAudio); + } + + @Test + void testBatchInsertAudioManagement() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + AudioManagement audioManagement = new AudioManagement(); + audioManagement.setRecordingName("批量测试录音_" + String.format("%02d", i)); + audioManagement.setRecordingTime(LocalDateTime.now().minusMinutes(i * 5)); + audioManagement.setSalesId("SALES" + String.format("%03d", i)); + audioManagement.setSalesName("销售员" + i); + audioManagement.setDuration(new BigDecimal(String.valueOf(10 + i * 0.5))); + audioManagement.setCustomerId("CUST" + String.format("%03d", i)); + audioManagement.setCustomerName("客户" + i); + audioManagement.setCustomerPhone("13" + String.format("%08d", 80000000 + i)); + audioManagement.setUploadTime(LocalDateTime.now().minusHours(i)); + audioManagement.setIntentionLevel(getRandomIntentionLevel()); + audioManagement.setDealershipId("DEAL" + String.format("%03d", i)); + audioManagement.setDealershipName("4S店" + i); + audioManagement.setProjectId("PROJ" + String.format("%03d", i)); + audioManagement.setProjectName("项目" + i); + audioManagement.setScriptModel(getRandomScriptModel()); + audioManagement.setUploadStatus("已上传"); + audioManagement.setSyncStatus("已同步"); + audioManagement.setIsMerged(i % 3 == 0); // 每3条数据合并一次 + audioManagement.setRemarks("批量测试录音备注_" + i); + audioManagement.setCompanyType("4S店"); + audioManagement.setEditStatus(i % 2 == 0 ? "已编辑" : "未编辑"); + audioManagement.setInfoCardType(getRandomInfoCardType()); + audioManagement.setInfoCarddescription(getRandomInfoCardDescription()); + audioManagement.setCreateTime(LocalDateTime.now().minusDays(i)); + audioManagement.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = audioManagementService.save(audioManagement); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(audioManagement.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = audioManagementService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } + + /** + * 获取随机的意向级别 + */ + private String getRandomIntentionLevel() { + String[] levels = {"高意向", "中意向", "低意向"}; + return levels[(int) (Math.random() * levels.length)]; + } + + /** + * 获取随机的话术模型 + */ + private String getRandomScriptModel() { + String[] models = {"标准话术", "高级话术", "基础话术", "专业话术", "定制话术"}; + return models[(int) (Math.random() * models.length)]; + } + + /** + * 获取随机的信息卡类型 + */ + private String getRandomInfoCardType() { + String[] types = {"意向车型", "购买情况", "来访目的", "试驾结果", "付款方式", "试驾专员"}; + return types[(int) (Math.random() * types.length)]; + } + + /** + * 获取随机的信息卡描述 + */ + private String getRandomInfoCardDescription() { + String[] descriptions = { + "奥迪A6L 2.0T", "宝马5系 2.0T", "奔驰E级 2.0T", "雷克萨斯ES 2.0L", + "首次购买", "置换购买", "增购", "了解车型", "试驾体验", "价格咨询", + "满意", "一般", "不满意", "全款", "分期", "贷款", "张专员", "李专员", "王专员" + }; + return descriptions[(int) (Math.random() * descriptions.length)]; + } +} \ No newline at end of file diff --git a/src/test/java/com/rj/service/CustomerManagementServiceTest.java b/src/test/java/com/rj/service/CustomerManagementServiceTest.java new file mode 100644 index 0000000..09e88c1 --- /dev/null +++ b/src/test/java/com/rj/service/CustomerManagementServiceTest.java @@ -0,0 +1,243 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.CustomerManagement; +import com.rj.service.impl.CustomerManagementServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class CustomerManagementServiceTest { + + @Autowired + private ICustomerManagementService customerManagementService; + + @Test + void testSaveCustomerManagement() { + // 创建测试数据 + CustomerManagement customerManagement = new CustomerManagement(); + customerManagement.setCustomerName("张三"); + customerManagement.setContact("13800138000"); + customerManagement.setDealershipId("DEAL001"); + customerManagement.setDealershipName("北京4S店"); + customerManagement.setSalesId("SALES001"); + customerManagement.setSalesName("李四"); + customerManagement.setRecordingCount(5); + customerManagement.setIntendedModel("奥迪A6L 2.0T"); + customerManagement.setInfoCard("高意向客户,有购买意向"); + customerManagement.setCreateTime(LocalDateTime.now()); + customerManagement.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = customerManagementService.save(customerManagement); + + // 验证保存成功 + assertTrue(result); + assertNotNull(customerManagement.getId()); + } + + @Test + void testGetCustomerManagementById() { + // 先保存一条测试数据 + CustomerManagement customerManagement = new CustomerManagement(); + customerManagement.setCustomerName("王五"); + customerManagement.setContact("13900139000"); + customerManagement.setDealershipId("DEAL002"); + customerManagement.setDealershipName("上海4S店"); + customerManagement.setSalesId("SALES002"); + customerManagement.setSalesName("赵六"); + customerManagement.setRecordingCount(3); + customerManagement.setIntendedModel("宝马5系 2.0T"); + customerManagement.setInfoCard("中意向客户,需要跟进"); + customerManagement.setCreateTime(LocalDateTime.now()); + customerManagement.setUpdateTime(LocalDateTime.now()); + + customerManagementService.save(customerManagement); + + // 测试根据ID查询功能 + CustomerManagement foundCustomer = customerManagementService.getById(customerManagement.getId()); + + // 验证查询结果 + assertNotNull(foundCustomer); + assertEquals("王五", foundCustomer.getCustomerName()); + assertEquals("13900139000", foundCustomer.getContact()); + assertEquals("赵六", foundCustomer.getSalesName()); + assertEquals("宝马5系 2.0T", foundCustomer.getIntendedModel()); + } + + @Test + void testGetCustomerManagementByContact() { + // 先保存一条测试数据 + CustomerManagement customerManagement = new CustomerManagement(); + customerManagement.setCustomerName("孙七"); + customerManagement.setContact("13700137000"); + customerManagement.setDealershipId("DEAL003"); + customerManagement.setDealershipName("广州4S店"); + customerManagement.setSalesId("SALES003"); + customerManagement.setSalesName("周八"); + customerManagement.setRecordingCount(8); + customerManagement.setIntendedModel("奔驰E级 2.0T"); + customerManagement.setInfoCard("低意向客户,需要更多沟通"); + customerManagement.setCreateTime(LocalDateTime.now()); + customerManagement.setUpdateTime(LocalDateTime.now()); + + customerManagementService.save(customerManagement); + + // 测试根据联系方式查询功能 + List customerList = customerManagementService.lambdaQuery() + .eq(CustomerManagement::getContact, "13700137000") + .list(); + + // 验证查询结果 + assertNotNull(customerList); + assertFalse(customerList.isEmpty()); + assertEquals("孙七", customerList.get(0).getCustomerName()); + assertEquals("13700137000", customerList.get(0).getContact()); + assertEquals("周八", customerList.get(0).getSalesName()); + } + + @Test + void testGetCustomerManagementByContactWithNoResults() { + // 测试查询不存在的联系方式 + List customerList = customerManagementService.lambdaQuery() + .eq(CustomerManagement::getContact, "00000000000") + .list(); + + // 验证查询结果为空 + assertNotNull(customerList); + assertTrue(customerList.isEmpty()); + } + + @Test + void testUpdateCustomerManagement() { + // 先保存一条测试数据 + CustomerManagement customerManagement = new CustomerManagement(); + customerManagement.setCustomerName("吴九"); + customerManagement.setContact("13600136000"); + customerManagement.setDealershipId("DEAL004"); + customerManagement.setDealershipName("深圳4S店"); + customerManagement.setSalesId("SALES004"); + customerManagement.setSalesName("郑十"); + customerManagement.setRecordingCount(12); + customerManagement.setIntendedModel("雷克萨斯ES 2.0L"); + customerManagement.setInfoCard("高意向客户,准备购买"); + customerManagement.setCreateTime(LocalDateTime.now()); + customerManagement.setUpdateTime(LocalDateTime.now()); + + customerManagementService.save(customerManagement); + + // 更新客户信息 + customerManagement.setRecordingCount(15); + customerManagement.setIntendedModel("雷克萨斯ES 2.5L"); + customerManagement.setInfoCard("高意向客户,已确定购买"); + customerManagement.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = customerManagementService.updateById(customerManagement); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + CustomerManagement updatedCustomer = customerManagementService.getById(customerManagement.getId()); + assertEquals(15, updatedCustomer.getRecordingCount()); + assertEquals("雷克萨斯ES 2.5L", updatedCustomer.getIntendedModel()); + assertEquals("高意向客户,已确定购买", updatedCustomer.getInfoCard()); + } + + @Test + void testDeleteCustomerManagement() { + // 先保存一条测试数据 + CustomerManagement customerManagement = new CustomerManagement(); + customerManagement.setCustomerName("钱十一"); + customerManagement.setContact("13500135000"); + customerManagement.setDealershipId("DEAL005"); + customerManagement.setDealershipName("杭州4S店"); + customerManagement.setSalesId("SALES005"); + customerManagement.setSalesName("孙十二"); + customerManagement.setRecordingCount(6); + customerManagement.setIntendedModel("沃尔沃S90 2.0T"); + customerManagement.setInfoCard("中意向客户,需要试驾"); + customerManagement.setCreateTime(LocalDateTime.now()); + customerManagement.setUpdateTime(LocalDateTime.now()); + + customerManagementService.save(customerManagement); + String customerId = customerManagement.getId(); + + // 测试删除功能 + boolean result = customerManagementService.removeById(customerId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + CustomerManagement deletedCustomer = customerManagementService.getById(customerId); + assertNull(deletedCustomer); + } + + @Test + void testBatchInsertCustomerManagement() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + CustomerManagement customerManagement = new CustomerManagement(); + customerManagement.setCustomerName("客户" + i); + customerManagement.setContact("13" + String.format("%08d", 80000000 + i)); + customerManagement.setDealershipId("DEAL" + String.format("%03d", i)); + customerManagement.setDealershipName("4S店" + i); + customerManagement.setSalesId("SALES" + String.format("%03d", i)); + customerManagement.setSalesName("销售员" + i); + customerManagement.setRecordingCount(1 + (i % 10)); // 1-10条录音 + customerManagement.setIntendedModel(getRandomIntendedModel()); + customerManagement.setInfoCard(getRandomInfoCard()); + customerManagement.setCreateTime(LocalDateTime.now().minusDays(i)); + customerManagement.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = customerManagementService.save(customerManagement); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(customerManagement.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = customerManagementService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } + + /** + * 获取随机的意向车型 + */ + private String getRandomIntendedModel() { + String[] models = { + "奥迪A6L 2.0T", "宝马5系 2.0T", "奔驰E级 2.0T", "雷克萨斯ES 2.0L", + "沃尔沃S90 2.0T", "凯迪拉克CT6 2.0T", "英菲尼迪Q70L 2.0T", "讴歌TLX 2.0T", + "捷豹XF 2.0T", "路虎揽胜 3.0T", "保时捷Panamera 2.9T", "玛莎拉蒂Ghibli 3.0T" + }; + return models[(int) (Math.random() * models.length)]; + } + + /** + * 获取随机的信息卡内容 + */ + private String getRandomInfoCard() { + String[] infoCards = { + "高意向客户,有购买意向", "中意向客户,需要跟进", "低意向客户,需要更多沟通", + "高意向客户,准备购买", "中意向客户,需要试驾", "低意向客户,价格敏感", + "高意向客户,已确定购买", "中意向客户,在比较中", "低意向客户,观望中", + "高意向客户,等待提车", "中意向客户,需要优惠", "低意向客户,需要教育" + }; + return infoCards[(int) (Math.random() * infoCards.length)]; + } +} \ No newline at end of file diff --git a/src/test/java/com/rj/service/DealershipServiceTest.java b/src/test/java/com/rj/service/DealershipServiceTest.java new file mode 100644 index 0000000..2485cfb --- /dev/null +++ b/src/test/java/com/rj/service/DealershipServiceTest.java @@ -0,0 +1,251 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.Dealership; +import com.rj.service.impl.DealershipServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class DealershipServiceTest { + + @Autowired + private IDealershipService dealershipService; + + @Test + void testSaveDealership() { + // 创建测试数据 + Dealership dealership = new Dealership(); + dealership.setDealershipName("北京奥迪4S店"); + dealership.setDealershipCode("BJ_AUDI_001"); + dealership.setRemainingHours(new BigDecimal("120.5")); + dealership.setSalesCount(15); + dealership.setAvgRecordings(25); + dealership.setAvgRecordingDuration(new BigDecimal("18.5")); + dealership.setRegion("华北"); + dealership.setGroupName("奥迪品牌组"); + dealership.setLanguage("中文"); + dealership.setDealershipType("4S店"); + dealership.setStatus(true); + dealership.setCreateTime(LocalDateTime.now()); + dealership.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = dealershipService.save(dealership); + + // 验证保存成功 + assertTrue(result); + assertNotNull(dealership.getId()); + } + + @Test + void testGetDealershipById() { + // 先保存一条测试数据 + Dealership dealership = new Dealership(); + dealership.setDealershipName("上海宝马4S店"); + dealership.setDealershipCode("SH_BMW_001"); + dealership.setRemainingHours(new BigDecimal("95.0")); + dealership.setSalesCount(20); + dealership.setAvgRecordings(30); + dealership.setAvgRecordingDuration(new BigDecimal("22.0")); + dealership.setRegion("华东"); + dealership.setGroupName("宝马品牌组"); + dealership.setLanguage("中文"); + dealership.setDealershipType("4S店"); + dealership.setStatus(true); + dealership.setCreateTime(LocalDateTime.now()); + dealership.setUpdateTime(LocalDateTime.now()); + + dealershipService.save(dealership); + + // 测试根据ID查询功能 + Dealership foundDealership = dealershipService.getById(dealership.getId()); + + // 验证查询结果 + assertNotNull(foundDealership); + assertEquals("上海宝马4S店", foundDealership.getDealershipName()); + assertEquals("SH_BMW_001", foundDealership.getDealershipCode()); + assertEquals(20, foundDealership.getSalesCount()); + assertEquals("华东", foundDealership.getRegion()); + } + + @Test + void testGetDealershipByCode() { + // 先保存一条测试数据 + Dealership dealership = new Dealership(); + dealership.setDealershipName("广州奔驰4S店"); + dealership.setDealershipCode("GZ_BENZ_001"); + dealership.setRemainingHours(new BigDecimal("150.0")); + dealership.setSalesCount(18); + dealership.setAvgRecordings(28); + dealership.setAvgRecordingDuration(new BigDecimal("20.5")); + dealership.setRegion("华南"); + dealership.setGroupName("奔驰品牌组"); + dealership.setLanguage("中文"); + dealership.setDealershipType("4S店"); + dealership.setStatus(true); + dealership.setCreateTime(LocalDateTime.now()); + dealership.setUpdateTime(LocalDateTime.now()); + + dealershipService.save(dealership); + + // 测试根据经销商代码查询功能 + List dealershipList = dealershipService.lambdaQuery() + .eq(Dealership::getDealershipCode, "GZ_BENZ_001") + .list(); + + // 验证查询结果 + assertNotNull(dealershipList); + assertFalse(dealershipList.isEmpty()); + assertEquals("广州奔驰4S店", dealershipList.get(0).getDealershipName()); + assertEquals("GZ_BENZ_001", dealershipList.get(0).getDealershipCode()); + assertEquals("华南", dealershipList.get(0).getRegion()); + } + + @Test + void testGetDealershipByCodeWithNoResults() { + // 测试查询不存在的经销商代码 + List dealershipList = dealershipService.lambdaQuery() + .eq(Dealership::getDealershipCode, "NOT_EXIST_001") + .list(); + + // 验证查询结果为空 + assertNotNull(dealershipList); + assertTrue(dealershipList.isEmpty()); + } + + @Test + void testUpdateDealership() { + // 先保存一条测试数据 + Dealership dealership = new Dealership(); + dealership.setDealershipName("深圳雷克萨斯4S店"); + dealership.setDealershipCode("SZ_LEXUS_001"); + dealership.setRemainingHours(new BigDecimal("80.0")); + dealership.setSalesCount(12); + dealership.setAvgRecordings(22); + dealership.setAvgRecordingDuration(new BigDecimal("16.5")); + dealership.setRegion("华南"); + dealership.setGroupName("雷克萨斯品牌组"); + dealership.setLanguage("中文"); + dealership.setDealershipType("4S店"); + dealership.setStatus(true); + dealership.setCreateTime(LocalDateTime.now()); + dealership.setUpdateTime(LocalDateTime.now()); + + dealershipService.save(dealership); + + // 更新经销商信息 + dealership.setSalesCount(15); + dealership.setAvgRecordings(25); + dealership.setRemainingHours(new BigDecimal("100.0")); + dealership.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = dealershipService.updateById(dealership); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + Dealership updatedDealership = dealershipService.getById(dealership.getId()); + assertEquals(15, updatedDealership.getSalesCount()); + assertEquals(25, updatedDealership.getAvgRecordings()); + assertEquals(new BigDecimal("100.0"), updatedDealership.getRemainingHours()); + } + + @Test + void testDeleteDealership() { + // 先保存一条测试数据 + Dealership dealership = new Dealership(); + dealership.setDealershipName("杭州沃尔沃4S店"); + dealership.setDealershipCode("HZ_VOLVO_001"); + dealership.setRemainingHours(new BigDecimal("60.0")); + dealership.setSalesCount(10); + dealership.setAvgRecordings(18); + dealership.setAvgRecordingDuration(new BigDecimal("15.0")); + dealership.setRegion("华东"); + dealership.setGroupName("沃尔沃品牌组"); + dealership.setLanguage("中文"); + dealership.setDealershipType("4S店"); + dealership.setStatus(true); + dealership.setCreateTime(LocalDateTime.now()); + dealership.setUpdateTime(LocalDateTime.now()); + + dealershipService.save(dealership); + String dealershipId = dealership.getId(); + + // 测试删除功能 + boolean result = dealershipService.removeById(dealershipId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + Dealership deletedDealership = dealershipService.getById(dealershipId); + assertNull(deletedDealership); + } + + @Test + void testBatchInsertDealership() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + Dealership dealership = new Dealership(); + dealership.setDealershipName("4S店" + i); + dealership.setDealershipCode("DEAL" + String.format("%03d", i)); + dealership.setRemainingHours(new BigDecimal(String.valueOf(50 + i * 2.5))); + dealership.setSalesCount(8 + (i % 15)); // 8-22个销售人员 + dealership.setAvgRecordings(15 + (i % 20)); // 15-34条录音 + dealership.setAvgRecordingDuration(new BigDecimal(String.valueOf(12 + i * 0.3))); + dealership.setRegion(getRandomRegion()); + dealership.setGroupName(getRandomGroupName()); + dealership.setLanguage("中文"); + dealership.setDealershipType("4S店"); + dealership.setStatus(i % 5 != 0); // 每5个中停用1个 + dealership.setCreateTime(LocalDateTime.now().minusDays(i)); + dealership.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = dealershipService.save(dealership); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(dealership.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = dealershipService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } + + /** + * 获取随机的地区 + */ + private String getRandomRegion() { + String[] regions = {"华北", "华东", "华南", "华中", "西南", "西北", "东北"}; + return regions[(int) (Math.random() * regions.length)]; + } + + /** + * 获取随机的品牌组 + */ + private String getRandomGroupName() { + String[] groups = { + "奥迪品牌组", "宝马品牌组", "奔驰品牌组", "雷克萨斯品牌组", "沃尔沃品牌组", + "凯迪拉克品牌组", "英菲尼迪品牌组", "讴歌品牌组", "捷豹品牌组", "路虎品牌组", + "保时捷品牌组", "玛莎拉蒂品牌组", "法拉利品牌组", "兰博基尼品牌组" + }; + return groups[(int) (Math.random() * groups.length)]; + } +} \ No newline at end of file diff --git a/src/test/java/com/rj/service/DeviceManagementServiceTest.java b/src/test/java/com/rj/service/DeviceManagementServiceTest.java new file mode 100644 index 0000000..d2f2740 --- /dev/null +++ b/src/test/java/com/rj/service/DeviceManagementServiceTest.java @@ -0,0 +1,298 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.DeviceManagement; +import com.rj.service.impl.DeviceManagementServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class DeviceManagementServiceTest { + + @Autowired + private IDeviceManagementService deviceManagementService; + + @Test + void testSaveDeviceManagement() { + // 创建测试数据 + DeviceManagement deviceManagement = new DeviceManagement(); + deviceManagement.setDeviceCode("DEVICE001"); + deviceManagement.setDealershipId("DEAL001"); + deviceManagement.setDealershipName("北京奥迪4S店"); + deviceManagement.setLastOnlineTime(LocalDateTime.now().minusHours(2)); + deviceManagement.setLastPowerOnTime(LocalDateTime.now().minusDays(1)); + deviceManagement.setLastPowerOffTime(LocalDateTime.now().minusHours(8)); + deviceManagement.setWifiName("Audi_WiFi_001"); + deviceManagement.setUnuploadedCount(5); + deviceManagement.setStorageSize("64GB"); + deviceManagement.setStorageUsed("32GB"); + deviceManagement.setRemainingBattery("85%"); + deviceManagement.setChargingStatus("充电中"); + deviceManagement.setBindUserId("USER001"); + deviceManagement.setBindUserName("张三"); + deviceManagement.setProjectId("PROJ001"); + deviceManagement.setProjectName("奥迪A6L项目"); + deviceManagement.setBindStatus(true); + deviceManagement.setCreateTime(LocalDateTime.now()); + deviceManagement.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = deviceManagementService.save(deviceManagement); + + // 验证保存成功 + assertTrue(result); + assertNotNull(deviceManagement.getId()); + } + + @Test + void testGetDeviceManagementById() { + // 先保存一条测试数据 + DeviceManagement deviceManagement = new DeviceManagement(); + deviceManagement.setDeviceCode("DEVICE002"); + deviceManagement.setDealershipId("DEAL002"); + deviceManagement.setDealershipName("上海宝马4S店"); + deviceManagement.setLastOnlineTime(LocalDateTime.now().minusHours(1)); + deviceManagement.setLastPowerOnTime(LocalDateTime.now().minusDays(2)); + deviceManagement.setLastPowerOffTime(LocalDateTime.now().minusHours(12)); + deviceManagement.setWifiName("BMW_WiFi_001"); + deviceManagement.setUnuploadedCount(3); + deviceManagement.setStorageSize("128GB"); + deviceManagement.setStorageUsed("64GB"); + deviceManagement.setRemainingBattery("60%"); + deviceManagement.setChargingStatus("未充电"); + deviceManagement.setBindUserId("USER002"); + deviceManagement.setBindUserName("李四"); + deviceManagement.setProjectId("PROJ002"); + deviceManagement.setProjectName("宝马5系项目"); + deviceManagement.setBindStatus(true); + deviceManagement.setCreateTime(LocalDateTime.now()); + deviceManagement.setUpdateTime(LocalDateTime.now()); + + deviceManagementService.save(deviceManagement); + + // 测试根据ID查询功能 + DeviceManagement foundDevice = deviceManagementService.getById(deviceManagement.getId()); + + // 验证查询结果 + assertNotNull(foundDevice); + assertEquals("DEVICE002", foundDevice.getDeviceCode()); + assertEquals("上海宝马4S店", foundDevice.getDealershipName()); + assertEquals("李四", foundDevice.getBindUserName()); + assertEquals("60%", foundDevice.getRemainingBattery()); + } + + @Test + void testGetDeviceManagementByCode() { + // 先保存一条测试数据 + DeviceManagement deviceManagement = new DeviceManagement(); + deviceManagement.setDeviceCode("DEVICE003"); + deviceManagement.setDealershipId("DEAL003"); + deviceManagement.setDealershipName("广州奔驰4S店"); + deviceManagement.setLastOnlineTime(LocalDateTime.now().minusMinutes(30)); + deviceManagement.setLastPowerOnTime(LocalDateTime.now().minusDays(1)); + deviceManagement.setLastPowerOffTime(LocalDateTime.now().minusHours(6)); + deviceManagement.setWifiName("BENZ_WiFi_001"); + deviceManagement.setUnuploadedCount(8); + deviceManagement.setStorageSize("256GB"); + deviceManagement.setStorageUsed("128GB"); + deviceManagement.setRemainingBattery("45%"); + deviceManagement.setChargingStatus("充电中"); + deviceManagement.setBindUserId("USER003"); + deviceManagement.setBindUserName("王五"); + deviceManagement.setProjectId("PROJ003"); + deviceManagement.setProjectName("奔驰E级项目"); + deviceManagement.setBindStatus(false); + deviceManagement.setCreateTime(LocalDateTime.now()); + deviceManagement.setUpdateTime(LocalDateTime.now()); + + deviceManagementService.save(deviceManagement); + + // 测试根据设备编号查询功能 + List deviceList = deviceManagementService.lambdaQuery() + .eq(DeviceManagement::getDeviceCode, "DEVICE003") + .list(); + + // 验证查询结果 + assertNotNull(deviceList); + assertFalse(deviceList.isEmpty()); + assertEquals("DEVICE003", deviceList.get(0).getDeviceCode()); + assertEquals("广州奔驰4S店", deviceList.get(0).getDealershipName()); + assertEquals("王五", deviceList.get(0).getBindUserName()); + } + + @Test + void testGetDeviceManagementByCodeWithNoResults() { + // 测试查询不存在的设备编号 + List deviceList = deviceManagementService.lambdaQuery() + .eq(DeviceManagement::getDeviceCode, "NOT_EXIST_001") + .list(); + + // 验证查询结果为空 + assertNotNull(deviceList); + assertTrue(deviceList.isEmpty()); + } + + @Test + void testUpdateDeviceManagement() { + // 先保存一条测试数据 + DeviceManagement deviceManagement = new DeviceManagement(); + deviceManagement.setDeviceCode("DEVICE004"); + deviceManagement.setDealershipId("DEAL004"); + deviceManagement.setDealershipName("深圳雷克萨斯4S店"); + deviceManagement.setLastOnlineTime(LocalDateTime.now().minusHours(3)); + deviceManagement.setLastPowerOnTime(LocalDateTime.now().minusDays(1)); + deviceManagement.setLastPowerOffTime(LocalDateTime.now().minusHours(10)); + deviceManagement.setWifiName("LEXUS_WiFi_001"); + deviceManagement.setUnuploadedCount(2); + deviceManagement.setStorageSize("512GB"); + deviceManagement.setStorageUsed("256GB"); + deviceManagement.setRemainingBattery("90%"); + deviceManagement.setChargingStatus("未充电"); + deviceManagement.setBindUserId("USER004"); + deviceManagement.setBindUserName("赵六"); + deviceManagement.setProjectId("PROJ004"); + deviceManagement.setProjectName("雷克萨斯ES项目"); + deviceManagement.setBindStatus(true); + deviceManagement.setCreateTime(LocalDateTime.now()); + deviceManagement.setUpdateTime(LocalDateTime.now()); + + deviceManagementService.save(deviceManagement); + + // 更新设备信息 + deviceManagement.setUnuploadedCount(0); + deviceManagement.setRemainingBattery("95%"); + deviceManagement.setChargingStatus("充电中"); + deviceManagement.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = deviceManagementService.updateById(deviceManagement); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + DeviceManagement updatedDevice = deviceManagementService.getById(deviceManagement.getId()); + assertEquals(0, updatedDevice.getUnuploadedCount()); + assertEquals("95%", updatedDevice.getRemainingBattery()); + assertEquals("充电中", updatedDevice.getChargingStatus()); + } + + @Test + void testDeleteDeviceManagement() { + // 先保存一条测试数据 + DeviceManagement deviceManagement = new DeviceManagement(); + deviceManagement.setDeviceCode("DEVICE005"); + deviceManagement.setDealershipId("DEAL005"); + deviceManagement.setDealershipName("杭州沃尔沃4S店"); + deviceManagement.setLastOnlineTime(LocalDateTime.now().minusHours(4)); + deviceManagement.setLastPowerOnTime(LocalDateTime.now().minusDays(2)); + deviceManagement.setLastPowerOffTime(LocalDateTime.now().minusHours(14)); + deviceManagement.setWifiName("VOLVO_WiFi_001"); + deviceManagement.setUnuploadedCount(1); + deviceManagement.setStorageSize("1TB"); + deviceManagement.setStorageUsed("512GB"); + deviceManagement.setRemainingBattery("30%"); + deviceManagement.setChargingStatus("充电中"); + deviceManagement.setBindUserId("USER005"); + deviceManagement.setBindUserName("孙七"); + deviceManagement.setProjectId("PROJ005"); + deviceManagement.setProjectName("沃尔沃S90项目"); + deviceManagement.setBindStatus(true); + deviceManagement.setCreateTime(LocalDateTime.now()); + deviceManagement.setUpdateTime(LocalDateTime.now()); + + deviceManagementService.save(deviceManagement); + String deviceId = deviceManagement.getId(); + + // 测试删除功能 + boolean result = deviceManagementService.removeById(deviceId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + DeviceManagement deletedDevice = deviceManagementService.getById(deviceId); + assertNull(deletedDevice); + } + + @Test + void testBatchInsertDeviceManagement() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + DeviceManagement deviceManagement = new DeviceManagement(); + deviceManagement.setDeviceCode("DEVICE" + String.format("%03d", i)); + deviceManagement.setDealershipId("DEAL" + String.format("%03d", i)); + deviceManagement.setDealershipName("4S店" + i); + deviceManagement.setLastOnlineTime(LocalDateTime.now().minusHours(i)); + deviceManagement.setLastPowerOnTime(LocalDateTime.now().minusDays(i % 7 + 1)); + deviceManagement.setLastPowerOffTime(LocalDateTime.now().minusHours(i * 2)); + deviceManagement.setWifiName("WiFi_" + String.format("%03d", i)); + deviceManagement.setUnuploadedCount(i % 10); // 0-9个未上传 + deviceManagement.setStorageSize(getRandomStorageSize()); + deviceManagement.setStorageUsed(getRandomStorageUsed()); + deviceManagement.setRemainingBattery(getRandomBattery()); + deviceManagement.setChargingStatus(getRandomChargingStatus()); + deviceManagement.setBindUserId("USER" + String.format("%03d", i)); + deviceManagement.setBindUserName("用户" + i); + deviceManagement.setProjectId("PROJ" + String.format("%03d", i)); + deviceManagement.setProjectName("项目" + i); + deviceManagement.setBindStatus(i % 3 != 0); // 每3个中1个未绑定 + deviceManagement.setCreateTime(LocalDateTime.now().minusDays(i)); + deviceManagement.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = deviceManagementService.save(deviceManagement); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(deviceManagement.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = deviceManagementService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } + + /** + * 获取随机的存储大小 + */ + private String getRandomStorageSize() { + String[] sizes = {"64GB", "128GB", "256GB", "512GB", "1TB", "2TB"}; + return sizes[(int) (Math.random() * sizes.length)]; + } + + /** + * 获取随机的已用存储 + */ + private String getRandomStorageUsed() { + String[] used = {"16GB", "32GB", "64GB", "128GB", "256GB", "512GB"}; + return used[(int) (Math.random() * used.length)]; + } + + /** + * 获取随机的电池电量 + */ + private String getRandomBattery() { + String[] batteries = {"20%", "35%", "50%", "65%", "80%", "95%", "100%"}; + return batteries[(int) (Math.random() * batteries.length)]; + } + + /** + * 获取随机的充电状态 + */ + private String getRandomChargingStatus() { + String[] statuses = {"充电中", "未充电", "充满电", "低电量"}; + return statuses[(int) (Math.random() * statuses.length)]; + } +} \ No newline at end of file diff --git a/src/test/java/com/rj/service/ProjectManagementServiceTest.java b/src/test/java/com/rj/service/ProjectManagementServiceTest.java new file mode 100644 index 0000000..7342f20 --- /dev/null +++ b/src/test/java/com/rj/service/ProjectManagementServiceTest.java @@ -0,0 +1,247 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.ProjectManagement; +import com.rj.service.impl.ProjectManagementServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class ProjectManagementServiceTest { + + @Autowired + private IProjectManagementService projectManagementService; + + @Test + void testSaveProjectManagement() { + // 创建测试数据 + ProjectManagement projectManagement = new ProjectManagement(); + projectManagement.setDealershipId("DEAL001"); + projectManagement.setProjectName("奥迪A6L项目"); + projectManagement.setScriptVersion(1); + projectManagement.setScriptPublishTime(LocalDateTime.now().minusDays(7)); + projectManagement.setSalespersonCount(15); + projectManagement.setAvgRecordingDuration(new BigDecimal("18.5")); + projectManagement.setStep("进行中"); + projectManagement.setGroupName("奥迪品牌组"); + projectManagement.setCreateTime(LocalDateTime.now()); + projectManagement.setDescription("奥迪A6L车型销售项目,包含话术培训和录音管理"); + projectManagement.setStatus(true); + projectManagement.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = projectManagementService.save(projectManagement); + + // 验证保存成功 + assertTrue(result); + assertNotNull(projectManagement.getId()); + } + + @Test + void testGetProjectManagementById() { + // 先保存一条测试数据 + ProjectManagement projectManagement = new ProjectManagement(); + projectManagement.setDealershipId("DEAL002"); + projectManagement.setProjectName("宝马5系项目"); + projectManagement.setScriptVersion(2); + projectManagement.setScriptPublishTime(LocalDateTime.now().minusDays(5)); + projectManagement.setSalespersonCount(20); + projectManagement.setAvgRecordingDuration(new BigDecimal("22.0")); + projectManagement.setStep("已完成"); + projectManagement.setGroupName("宝马品牌组"); + projectManagement.setCreateTime(LocalDateTime.now()); + projectManagement.setDescription("宝马5系车型销售项目,已完成话术培训"); + projectManagement.setStatus(true); + projectManagement.setUpdateTime(LocalDateTime.now()); + + projectManagementService.save(projectManagement); + + // 测试根据ID查询功能 + ProjectManagement foundProject = projectManagementService.getById(projectManagement.getId()); + + // 验证查询结果 + assertNotNull(foundProject); + assertEquals("宝马5系项目", foundProject.getProjectName()); + assertEquals(2, foundProject.getScriptVersion()); + assertEquals(20, foundProject.getSalespersonCount()); + assertEquals("已完成", foundProject.getStep()); + } + + @Test + void testGetProjectManagementByName() { + // 先保存一条测试数据 + ProjectManagement projectManagement = new ProjectManagement(); + projectManagement.setDealershipId("DEAL003"); + projectManagement.setProjectName("奔驰E级项目"); + projectManagement.setScriptVersion(1); + projectManagement.setScriptPublishTime(LocalDateTime.now().minusDays(3)); + projectManagement.setSalespersonCount(18); + projectManagement.setAvgRecordingDuration(new BigDecimal("20.5")); + projectManagement.setStep("进行中"); + projectManagement.setGroupName("奔驰品牌组"); + projectManagement.setCreateTime(LocalDateTime.now()); + projectManagement.setDescription("奔驰E级车型销售项目,正在进行中"); + projectManagement.setStatus(true); + projectManagement.setUpdateTime(LocalDateTime.now()); + + projectManagementService.save(projectManagement); + + // 测试根据项目名称查询功能 + List projectList = projectManagementService.lambdaQuery() + .eq(ProjectManagement::getProjectName, "奔驰E级项目") + .list(); + + // 验证查询结果 + assertNotNull(projectList); + assertFalse(projectList.isEmpty()); + assertEquals("奔驰E级项目", projectList.get(0).getProjectName()); + assertEquals("DEAL003", projectList.get(0).getDealershipId()); + assertEquals("奔驰品牌组", projectList.get(0).getGroupName()); + } + + @Test + void testGetProjectManagementByNameWithNoResults() { + // 测试查询不存在的项目名称 + List projectList = projectManagementService.lambdaQuery() + .eq(ProjectManagement::getProjectName, "不存在的项目") + .list(); + + // 验证查询结果为空 + assertNotNull(projectList); + assertTrue(projectList.isEmpty()); + } + + @Test + void testUpdateProjectManagement() { + // 先保存一条测试数据 + ProjectManagement projectManagement = new ProjectManagement(); + projectManagement.setDealershipId("DEAL004"); + projectManagement.setProjectName("雷克萨斯ES项目"); + projectManagement.setScriptVersion(1); + projectManagement.setScriptPublishTime(LocalDateTime.now().minusDays(2)); + projectManagement.setSalespersonCount(12); + projectManagement.setAvgRecordingDuration(new BigDecimal("16.5")); + projectManagement.setStep("准备中"); + projectManagement.setGroupName("雷克萨斯品牌组"); + projectManagement.setCreateTime(LocalDateTime.now()); + projectManagement.setDescription("雷克萨斯ES车型销售项目,正在准备中"); + projectManagement.setStatus(true); + projectManagement.setUpdateTime(LocalDateTime.now()); + + projectManagementService.save(projectManagement); + + // 更新项目信息 + projectManagement.setScriptVersion(2); + projectManagement.setSalespersonCount(15); + projectManagement.setStep("进行中"); + projectManagement.setDescription("雷克萨斯ES车型销售项目,已开始进行"); + projectManagement.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = projectManagementService.updateById(projectManagement); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + ProjectManagement updatedProject = projectManagementService.getById(projectManagement.getId()); + assertEquals(2, updatedProject.getScriptVersion()); + assertEquals(15, updatedProject.getSalespersonCount()); + assertEquals("进行中", updatedProject.getStep()); + assertEquals("雷克萨斯ES车型销售项目,已开始进行", updatedProject.getDescription()); + } + + @Test + void testDeleteProjectManagement() { + // 先保存一条测试数据 + ProjectManagement projectManagement = new ProjectManagement(); + projectManagement.setDealershipId("DEAL005"); + projectManagement.setProjectName("沃尔沃S90项目"); + projectManagement.setScriptVersion(1); + projectManagement.setScriptPublishTime(LocalDateTime.now().minusDays(1)); + projectManagement.setSalespersonCount(10); + projectManagement.setAvgRecordingDuration(new BigDecimal("15.0")); + projectManagement.setStep("已完成"); + projectManagement.setGroupName("沃尔沃品牌组"); + projectManagement.setCreateTime(LocalDateTime.now()); + projectManagement.setDescription("沃尔沃S90车型销售项目,已完成"); + projectManagement.setStatus(false); + projectManagement.setUpdateTime(LocalDateTime.now()); + + projectManagementService.save(projectManagement); + String projectId = projectManagement.getId(); + + // 测试删除功能 + boolean result = projectManagementService.removeById(projectId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + ProjectManagement deletedProject = projectManagementService.getById(projectId); + assertNull(deletedProject); + } + + @Test + void testBatchInsertProjectManagement() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + ProjectManagement projectManagement = new ProjectManagement(); + projectManagement.setDealershipId("DEAL" + String.format("%03d", i)); + projectManagement.setProjectName("项目" + i); + projectManagement.setScriptVersion(1 + (i % 5)); // 1-5版本 + projectManagement.setScriptPublishTime(LocalDateTime.now().minusDays(i)); + projectManagement.setSalespersonCount(8 + (i % 15)); // 8-22个销售人员 + projectManagement.setAvgRecordingDuration(new BigDecimal(String.valueOf(12 + i * 0.5))); + projectManagement.setStep(getRandomStep()); + projectManagement.setGroupName(getRandomGroupName()); + projectManagement.setCreateTime(LocalDateTime.now().minusDays(i)); + projectManagement.setDescription("项目" + i + "的描述信息,包含详细的项目说明"); + projectManagement.setStatus(i % 4 != 0); // 每4个中停用1个 + projectManagement.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = projectManagementService.save(projectManagement); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(projectManagement.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = projectManagementService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } + + /** + * 获取随机的项目步骤 + */ + private String getRandomStep() { + String[] steps = {"准备中", "进行中", "已完成", "暂停中", "已取消"}; + return steps[(int) (Math.random() * steps.length)]; + } + + /** + * 获取随机的品牌组 + */ + private String getRandomGroupName() { + String[] groups = { + "奥迪品牌组", "宝马品牌组", "奔驰品牌组", "雷克萨斯品牌组", "沃尔沃品牌组", + "凯迪拉克品牌组", "英菲尼迪品牌组", "讴歌品牌组", "捷豹品牌组", "路虎品牌组", + "保时捷品牌组", "玛莎拉蒂品牌组", "法拉利品牌组", "兰博基尼品牌组" + }; + return groups[(int) (Math.random() * groups.length)]; + } +} \ No newline at end of file diff --git a/src/test/java/com/rj/service/SalesManagementServiceTest.java b/src/test/java/com/rj/service/SalesManagementServiceTest.java new file mode 100644 index 0000000..725fc8f --- /dev/null +++ b/src/test/java/com/rj/service/SalesManagementServiceTest.java @@ -0,0 +1,259 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.SalesManagement; +import com.rj.service.impl.SalesManagementServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class SalesManagementServiceTest { + + @Autowired + private ISalesManagementService salesManagementService; + + @Test + void testSaveSalesManagement() { + // 创建测试数据 + SalesManagement salesManagement = new SalesManagement(); + salesManagement.setSalesName("张三"); + salesManagement.setLoginAccount("zhangsan001"); + salesManagement.setRecordingCount(25); + salesManagement.setAvgRecordingDuration(new BigDecimal("18.5")); + salesManagement.setTotalRecordingHours(new BigDecimal("7.5")); + salesManagement.setProjectId("PROJ001"); + salesManagement.setProjectName("奥迪A6L项目"); + salesManagement.setDealershipId("DEAL001"); + salesManagement.setDealershipName("北京奥迪4S店"); + salesManagement.setRole("销售顾问"); + salesManagement.setCreateTime(LocalDateTime.now()); + salesManagement.setLastRecordingTime(LocalDateTime.now().minusHours(2)); + salesManagement.setLastLoginTime(LocalDateTime.now().minusHours(1)); + salesManagement.setLastLoginIp("192.168.1.100"); + salesManagement.setStatus(true); + salesManagement.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = salesManagementService.save(salesManagement); + + // 验证保存成功 + assertTrue(result); + assertNotNull(salesManagement.getId()); + } + + @Test + void testGetSalesManagementById() { + // 先保存一条测试数据 + SalesManagement salesManagement = new SalesManagement(); + salesManagement.setSalesName("李四"); + salesManagement.setLoginAccount("lisi002"); + salesManagement.setRecordingCount(30); + salesManagement.setAvgRecordingDuration(new BigDecimal("22.0")); + salesManagement.setTotalRecordingHours(new BigDecimal("11.0")); + salesManagement.setProjectId("PROJ002"); + salesManagement.setProjectName("宝马5系项目"); + salesManagement.setDealershipId("DEAL002"); + salesManagement.setDealershipName("上海宝马4S店"); + salesManagement.setRole("高级销售顾问"); + salesManagement.setCreateTime(LocalDateTime.now()); + salesManagement.setLastRecordingTime(LocalDateTime.now().minusHours(3)); + salesManagement.setLastLoginTime(LocalDateTime.now().minusHours(2)); + salesManagement.setLastLoginIp("192.168.1.101"); + salesManagement.setStatus(true); + salesManagement.setUpdateTime(LocalDateTime.now()); + + salesManagementService.save(salesManagement); + + // 测试根据ID查询功能 + SalesManagement foundSales = salesManagementService.getById(salesManagement.getId()); + + // 验证查询结果 + assertNotNull(foundSales); + assertEquals("李四", foundSales.getSalesName()); + assertEquals("lisi002", foundSales.getLoginAccount()); + assertEquals(30, foundSales.getRecordingCount()); + assertEquals("高级销售顾问", foundSales.getRole()); + } + + @Test + void testGetSalesManagementByAccount() { + // 先保存一条测试数据 + SalesManagement salesManagement = new SalesManagement(); + salesManagement.setSalesName("王五"); + salesManagement.setLoginAccount("wangwu003"); + salesManagement.setRecordingCount(18); + salesManagement.setAvgRecordingDuration(new BigDecimal("16.5")); + salesManagement.setTotalRecordingHours(new BigDecimal("5.0")); + salesManagement.setProjectId("PROJ003"); + salesManagement.setProjectName("奔驰E级项目"); + salesManagement.setDealershipId("DEAL003"); + salesManagement.setDealershipName("广州奔驰4S店"); + salesManagement.setRole("销售经理"); + salesManagement.setCreateTime(LocalDateTime.now()); + salesManagement.setLastRecordingTime(LocalDateTime.now().minusHours(4)); + salesManagement.setLastLoginTime(LocalDateTime.now().minusHours(3)); + salesManagement.setLastLoginIp("192.168.1.102"); + salesManagement.setStatus(true); + salesManagement.setUpdateTime(LocalDateTime.now()); + + salesManagementService.save(salesManagement); + + // 测试根据登录账号查询功能 + List salesList = salesManagementService.lambdaQuery() + .eq(SalesManagement::getLoginAccount, "wangwu003") + .list(); + + // 验证查询结果 + assertNotNull(salesList); + assertFalse(salesList.isEmpty()); + assertEquals("王五", salesList.get(0).getSalesName()); + assertEquals("wangwu003", salesList.get(0).getLoginAccount()); + assertEquals("销售经理", salesList.get(0).getRole()); + } + + @Test + void testGetSalesManagementByAccountWithNoResults() { + // 测试查询不存在的登录账号 + List salesList = salesManagementService.lambdaQuery() + .eq(SalesManagement::getLoginAccount, "notexist001") + .list(); + + // 验证查询结果为空 + assertNotNull(salesList); + assertTrue(salesList.isEmpty()); + } + + @Test + void testUpdateSalesManagement() { + // 先保存一条测试数据 + SalesManagement salesManagement = new SalesManagement(); + salesManagement.setSalesName("赵六"); + salesManagement.setLoginAccount("zhaoliu004"); + salesManagement.setRecordingCount(22); + salesManagement.setAvgRecordingDuration(new BigDecimal("19.5")); + salesManagement.setTotalRecordingHours(new BigDecimal("7.0")); + salesManagement.setProjectId("PROJ004"); + salesManagement.setProjectName("雷克萨斯ES项目"); + salesManagement.setDealershipId("DEAL004"); + salesManagement.setDealershipName("深圳雷克萨斯4S店"); + salesManagement.setRole("销售顾问"); + salesManagement.setCreateTime(LocalDateTime.now()); + salesManagement.setLastRecordingTime(LocalDateTime.now().minusHours(5)); + salesManagement.setLastLoginTime(LocalDateTime.now().minusHours(4)); + salesManagement.setLastLoginIp("192.168.1.103"); + salesManagement.setStatus(true); + salesManagement.setUpdateTime(LocalDateTime.now()); + + salesManagementService.save(salesManagement); + + // 更新销售信息 + salesManagement.setRecordingCount(28); + salesManagement.setAvgRecordingDuration(new BigDecimal("21.0")); + salesManagement.setTotalRecordingHours(new BigDecimal("9.8")); + salesManagement.setRole("高级销售顾问"); + salesManagement.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = salesManagementService.updateById(salesManagement); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + SalesManagement updatedSales = salesManagementService.getById(salesManagement.getId()); + assertEquals(28, updatedSales.getRecordingCount()); + assertEquals(new BigDecimal("21.0"), updatedSales.getAvgRecordingDuration()); + assertEquals(new BigDecimal("9.8"), updatedSales.getTotalRecordingHours()); + assertEquals("高级销售顾问", updatedSales.getRole()); + } + + @Test + void testDeleteSalesManagement() { + // 先保存一条测试数据 + SalesManagement salesManagement = new SalesManagement(); + salesManagement.setSalesName("孙七"); + salesManagement.setLoginAccount("sunqi005"); + salesManagement.setRecordingCount(15); + salesManagement.setAvgRecordingDuration(new BigDecimal("15.0")); + salesManagement.setTotalRecordingHours(new BigDecimal("3.8")); + salesManagement.setProjectId("PROJ005"); + salesManagement.setProjectName("沃尔沃S90项目"); + salesManagement.setDealershipId("DEAL005"); + salesManagement.setDealershipName("杭州沃尔沃4S店"); + salesManagement.setRole("销售顾问"); + salesManagement.setCreateTime(LocalDateTime.now()); + salesManagement.setLastRecordingTime(LocalDateTime.now().minusHours(6)); + salesManagement.setLastLoginTime(LocalDateTime.now().minusHours(5)); + salesManagement.setLastLoginIp("192.168.1.104"); + salesManagement.setStatus(true); + salesManagement.setUpdateTime(LocalDateTime.now()); + + salesManagementService.save(salesManagement); + String salesId = salesManagement.getId(); + + // 测试删除功能 + boolean result = salesManagementService.removeById(salesId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + SalesManagement deletedSales = salesManagementService.getById(salesId); + assertNull(deletedSales); + } + + @Test + void testBatchInsertSalesManagement() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + SalesManagement salesManagement = new SalesManagement(); + salesManagement.setSalesName("销售员" + i % 5); + salesManagement.setLoginAccount("sales" + String.format("%03d", i)); + salesManagement.setRecordingCount(10 + (i % 25)); // 10-34条录音 + salesManagement.setAvgRecordingDuration(new BigDecimal(String.valueOf(12 + i * 0.3))); + salesManagement.setTotalRecordingHours(new BigDecimal(String.valueOf(2 + i * 0.2))); + salesManagement.setProjectId("PROJ" + String.format("%03d", i)); + salesManagement.setProjectName("项目" + i); + salesManagement.setDealershipId("DEAL" + String.format("%03d", i)); + salesManagement.setDealershipName("4S店" + i%5); + salesManagement.setRole(getRandomRole()); + salesManagement.setCreateTime(LocalDateTime.now().minusDays(i)); + salesManagement.setLastRecordingTime(LocalDateTime.now().minusHours(i)); + salesManagement.setLastLoginTime(LocalDateTime.now().minusHours(i * 2)); + salesManagement.setLastLoginIp("192.168.1." + (100 + i)); + salesManagement.setStatus(i % 5 != 0); // 每5个中停用1个 + salesManagement.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = salesManagementService.save(salesManagement); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(salesManagement.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = salesManagementService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } + + /** + * 获取随机的销售角色 + */ + private String getRandomRole() { + String[] roles = {"销售顾问", "高级销售顾问", "销售经理", "销售总监", "销售主管"}; + return roles[(int) (Math.random() * roles.length)]; + } +} \ No newline at end of file diff --git a/src/test/java/com/rj/service/VideoManagementServiceTest.java b/src/test/java/com/rj/service/VideoManagementServiceTest.java new file mode 100644 index 0000000..234591f --- /dev/null +++ b/src/test/java/com/rj/service/VideoManagementServiceTest.java @@ -0,0 +1,223 @@ +package com.rj.service; + +/** + * Author: 李中华 wx: spllzh email(qq): 28668817@qq.com + * Date: 2025/8/5 19:02 + **/ + +import com.rj.Langchain4jHeima20250803Application; +import com.rj.entity.VideoManagement; +import com.rj.service.impl.VideoManagementServiceImpl; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = Langchain4jHeima20250803Application.class) +class VideoManagementServiceTest { + + @Autowired + private IVideoManagementService videoManagementService; + + @Test + void testSaveVideoManagement() { + // 创建测试数据 + VideoManagement videoManagement = new VideoManagement(); + videoManagement.setVideoName("奥迪A6L试驾视频"); + videoManagement.setDealershipId("DEAL001"); + videoManagement.setDealershipName("北京奥迪4S店"); + videoManagement.setSalesId("SALES001"); + videoManagement.setSalesName("张三"); + videoManagement.setCustomerId("CUST001"); + videoManagement.setCustomerName("李四"); + videoManagement.setCustomerPhone("13800138000"); + videoManagement.setDuration(new BigDecimal("15.5")); + videoManagement.setRecordTime(LocalDateTime.now().minusHours(2)); + videoManagement.setCreateTime(LocalDateTime.now()); + videoManagement.setUpdateTime(LocalDateTime.now()); + + // 测试保存功能 + boolean result = videoManagementService.save(videoManagement); + + // 验证保存成功 + assertTrue(result); + assertNotNull(videoManagement.getId()); + } + + @Test + void testGetVideoManagementById() { + // 先保存一条测试数据 + VideoManagement videoManagement = new VideoManagement(); + videoManagement.setVideoName("宝马5系试驾视频"); + videoManagement.setDealershipId("DEAL002"); + videoManagement.setDealershipName("上海宝马4S店"); + videoManagement.setSalesId("SALES002"); + videoManagement.setSalesName("王五"); + videoManagement.setCustomerId("CUST002"); + videoManagement.setCustomerName("赵六"); + videoManagement.setCustomerPhone("13900139000"); + videoManagement.setDuration(new BigDecimal("20.0")); + videoManagement.setRecordTime(LocalDateTime.now().minusHours(3)); + videoManagement.setCreateTime(LocalDateTime.now()); + videoManagement.setUpdateTime(LocalDateTime.now()); + + videoManagementService.save(videoManagement); + + // 测试根据ID查询功能 + VideoManagement foundVideo = videoManagementService.getById(videoManagement.getId()); + + // 验证查询结果 + assertNotNull(foundVideo); + assertEquals("宝马5系试驾视频", foundVideo.getVideoName()); + assertEquals("上海宝马4S店", foundVideo.getDealershipName()); + assertEquals("王五", foundVideo.getSalesName()); + assertEquals("赵六", foundVideo.getCustomerName()); + } + + @Test + void testGetVideoManagementByCustomerPhone() { + // 先保存一条测试数据 + VideoManagement videoManagement = new VideoManagement(); + videoManagement.setVideoName("奔驰E级试驾视频"); + videoManagement.setDealershipId("DEAL003"); + videoManagement.setDealershipName("广州奔驰4S店"); + videoManagement.setSalesId("SALES003"); + videoManagement.setSalesName("孙七"); + videoManagement.setCustomerId("CUST003"); + videoManagement.setCustomerName("周八"); + videoManagement.setCustomerPhone("13700137000"); + videoManagement.setDuration(new BigDecimal("18.5")); + videoManagement.setRecordTime(LocalDateTime.now().minusHours(4)); + videoManagement.setCreateTime(LocalDateTime.now()); + videoManagement.setUpdateTime(LocalDateTime.now()); + + videoManagementService.save(videoManagement); + + // 测试根据客户手机号查询功能 + List videoList = videoManagementService.lambdaQuery() + .eq(VideoManagement::getCustomerPhone, "13700137000") + .list(); + + // 验证查询结果 + assertNotNull(videoList); + assertFalse(videoList.isEmpty()); + assertEquals("奔驰E级试驾视频", videoList.get(0).getVideoName()); + assertEquals("13700137000", videoList.get(0).getCustomerPhone()); + assertEquals("周八", videoList.get(0).getCustomerName()); + } + + @Test + void testGetVideoManagementByCustomerPhoneWithNoResults() { + // 测试查询不存在的客户手机号 + List videoList = videoManagementService.lambdaQuery() + .eq(VideoManagement::getCustomerPhone, "00000000000") + .list(); + + // 验证查询结果为空 + assertNotNull(videoList); + assertTrue(videoList.isEmpty()); + } + + @Test + void testUpdateVideoManagement() { + // 先保存一条测试数据 + VideoManagement videoManagement = new VideoManagement(); + videoManagement.setVideoName("雷克萨斯ES试驾视频"); + videoManagement.setDealershipId("DEAL004"); + videoManagement.setDealershipName("深圳雷克萨斯4S店"); + videoManagement.setSalesId("SALES004"); + videoManagement.setSalesName("吴九"); + videoManagement.setCustomerId("CUST004"); + videoManagement.setCustomerName("郑十"); + videoManagement.setCustomerPhone("13600136000"); + videoManagement.setDuration(new BigDecimal("25.0")); + videoManagement.setRecordTime(LocalDateTime.now().minusHours(5)); + videoManagement.setCreateTime(LocalDateTime.now()); + videoManagement.setUpdateTime(LocalDateTime.now()); + + videoManagementService.save(videoManagement); + + // 更新视频信息 + videoManagement.setVideoName("雷克萨斯ES详细试驾视频"); + videoManagement.setDuration(new BigDecimal("30.0")); + videoManagement.setUpdateTime(LocalDateTime.now()); + + // 测试更新功能 + boolean result = videoManagementService.updateById(videoManagement); + + // 验证更新成功 + assertTrue(result); + + // 重新查询验证更新结果 + VideoManagement updatedVideo = videoManagementService.getById(videoManagement.getId()); + assertEquals("雷克萨斯ES详细试驾视频", updatedVideo.getVideoName()); + assertEquals(new BigDecimal("30.0"), updatedVideo.getDuration()); + } + + @Test + void testDeleteVideoManagement() { + // 先保存一条测试数据 + VideoManagement videoManagement = new VideoManagement(); + videoManagement.setVideoName("沃尔沃S90试驾视频"); + videoManagement.setDealershipId("DEAL005"); + videoManagement.setDealershipName("杭州沃尔沃4S店"); + videoManagement.setSalesId("SALES005"); + videoManagement.setSalesName("钱十一"); + videoManagement.setCustomerId("CUST005"); + videoManagement.setCustomerName("孙十二"); + videoManagement.setCustomerPhone("13500135000"); + videoManagement.setDuration(new BigDecimal("22.5")); + videoManagement.setRecordTime(LocalDateTime.now().minusHours(6)); + videoManagement.setCreateTime(LocalDateTime.now()); + videoManagement.setUpdateTime(LocalDateTime.now()); + + videoManagementService.save(videoManagement); + String videoId = videoManagement.getId(); + + // 测试删除功能 + boolean result = videoManagementService.removeById(videoId); + + // 验证删除成功 + assertTrue(result); + + // 验证数据已被删除 + VideoManagement deletedVideo = videoManagementService.getById(videoId); + assertNull(deletedVideo); + } + + @Test + void testBatchInsertVideoManagement() { + // 创建30条测试数据 + for (int i = 1; i <= 30; i++) { + VideoManagement videoManagement = new VideoManagement(); + videoManagement.setVideoName("试驾视频" + i); + videoManagement.setDealershipId("DEAL" + String.format("%03d", i)); + videoManagement.setDealershipName("4S店" + i%5); + videoManagement.setSalesId("SALES" + String.format("%03d", i%5)); + videoManagement.setSalesName("销售员" + i%5); + videoManagement.setCustomerId("CUST" + String.format("%03d", i%5)); + videoManagement.setCustomerName("客户" + i%5); + videoManagement.setCustomerPhone("13" + String.format("%08d", 80000000 + i)); + videoManagement.setDuration(new BigDecimal(String.valueOf(10 + i * 0.5))); + videoManagement.setRecordTime(LocalDateTime.now().minusHours(i)); + videoManagement.setCreateTime(LocalDateTime.now().minusDays(i)); + videoManagement.setUpdateTime(LocalDateTime.now().minusHours(i)); + + // 保存数据 + boolean result = videoManagementService.save(videoManagement); + assertTrue(result, "第" + i + "条数据保存失败"); + assertNotNull(videoManagement.getId(), "第" + i + "条数据ID为空"); + } + + // 验证总共插入了30条数据 + long count = videoManagementService.count(); + assertTrue(count >= 30, "插入的数据数量不足30条,实际数量:" + count); + + System.out.println("成功插入30条测试数据,当前数据库总记录数:" + count); + } +} \ No newline at end of file