From 3e8ba9f6f1de99d78bc4e396ac7fc42e86e83799 Mon Sep 17 00:00:00 2001 From: spllzh <28668817@qq.com> Date: Fri, 8 Aug 2025 17:10:37 +0800 Subject: [PATCH] =?UTF-8?q?AI=E6=99=BA=E8=83=BD=E5=B7=A5=E7=89=8C=E7=9A=84?= =?UTF-8?q?=E9=97=A8=E5=BA=97=E7=AE=A1=E7=90=86=EF=BC=8C=20=E9=94=80?= =?UTF-8?q?=E5=94=AE=E7=AE=A1=E7=90=86=20=EF=BC=8C=20=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E7=AE=A1=E7=90=86=EF=BC=8C=20=E5=AE=A2=E6=88=B7=E7=AE=A1?= =?UTF-8?q?=E7=90=86=EF=BC=8C=20=E8=AE=BE=E5=A4=87=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=8C=20=E5=BD=95=E9=9F=B3=E7=AE=A1=E7=90=86=EF=BC=8C=20?= =?UTF-8?q?=E8=A7=86=E9=A2=91=E7=AE=A1=E7=90=86=20=EF=BC=8C=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E9=AA=A8=E6=9E=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Langchain4jHeima20250803Application.java | 2 +- .../rj/aiservice/CstAIStreamingService.java | 4 +- .../java/com/rj/config/SwaggerOpenAPI.java | 3 - .../controller/AudioManagementController.java | 297 +++++++++++++++++ .../CustomerManagementController.java | 291 +++++++++++++++++ .../rj/controller/DealershipController.java | 297 +++++++++++++++++ .../DeviceManagementController.java | 296 +++++++++++++++++ .../ProjectManagementController.java | 297 +++++++++++++++++ .../controller/SalesManagementController.java | 302 ++++++++++++++++++ .../controller/VideoManagementController.java | 301 +++++++++++++++++ .../com/rj/embedding/EnbedingModelConfig.java | 7 +- .../com/rj/mapper/AudioManagementMapper.java | 16 + .../rj/mapper/CustomerManagementMapper.java | 16 + .../java/com/rj/mapper/DealershipMapper.java | 16 + .../com/rj/mapper/DeviceManagementMapper.java | 16 + .../rj/mapper/ProjectManagementMapper.java | 16 + .../com/rj/mapper/SalesManagementMapper.java | 16 + .../com/rj/mapper/VideoManagementMapper.java | 16 + .../rj/service/IAudioManagementService.java | 16 + .../service/ICustomerManagementService.java | 16 + .../com/rj/service/IDealershipService.java | 16 + .../rj/service/IDeviceManagementService.java | 16 + .../rj/service/IProjectManagementService.java | 16 + .../rj/service/ISalesManagementService.java | 16 + .../rj/service/IVideoManagementService.java | 16 + .../impl/AudioManagementServiceImpl.java | 20 ++ .../impl/CustomerManagementServiceImpl.java | 20 ++ .../service/impl/DealershipServiceImpl.java | 20 ++ .../impl/DeviceManagementServiceImpl.java | 20 ++ .../impl/ProjectManagementServiceImpl.java | 20 ++ .../impl/SalesManagementServiceImpl.java | 20 ++ .../impl/VideoManagementServiceImpl.java | 20 ++ src/main/resources/application.yml | 38 ++- .../mapper/AudioManagementMapper.xml | 41 +++ .../mapper/CustomerManagementMapper.xml | 26 ++ .../resources/mapper/DealershipMapper.xml | 28 ++ .../mapper/DeviceManagementMapper.xml | 34 ++ .../mapper/ProjectManagementMapper.xml | 27 ++ .../mapper/SalesManagementMapper.xml | 31 ++ .../mapper/VideoManagementMapper.xml | 27 ++ 40 files changed, 2701 insertions(+), 12 deletions(-) create mode 100644 src/main/java/com/rj/controller/AudioManagementController.java create mode 100644 src/main/java/com/rj/controller/CustomerManagementController.java create mode 100644 src/main/java/com/rj/controller/DealershipController.java create mode 100644 src/main/java/com/rj/controller/DeviceManagementController.java create mode 100644 src/main/java/com/rj/controller/ProjectManagementController.java create mode 100644 src/main/java/com/rj/controller/SalesManagementController.java create mode 100644 src/main/java/com/rj/controller/VideoManagementController.java create mode 100644 src/main/java/com/rj/mapper/AudioManagementMapper.java create mode 100644 src/main/java/com/rj/mapper/CustomerManagementMapper.java create mode 100644 src/main/java/com/rj/mapper/DealershipMapper.java create mode 100644 src/main/java/com/rj/mapper/DeviceManagementMapper.java create mode 100644 src/main/java/com/rj/mapper/ProjectManagementMapper.java create mode 100644 src/main/java/com/rj/mapper/SalesManagementMapper.java create mode 100644 src/main/java/com/rj/mapper/VideoManagementMapper.java create mode 100644 src/main/java/com/rj/service/IAudioManagementService.java create mode 100644 src/main/java/com/rj/service/ICustomerManagementService.java create mode 100644 src/main/java/com/rj/service/IDealershipService.java create mode 100644 src/main/java/com/rj/service/IDeviceManagementService.java create mode 100644 src/main/java/com/rj/service/IProjectManagementService.java create mode 100644 src/main/java/com/rj/service/ISalesManagementService.java create mode 100644 src/main/java/com/rj/service/IVideoManagementService.java create mode 100644 src/main/java/com/rj/service/impl/AudioManagementServiceImpl.java create mode 100644 src/main/java/com/rj/service/impl/CustomerManagementServiceImpl.java create mode 100644 src/main/java/com/rj/service/impl/DealershipServiceImpl.java create mode 100644 src/main/java/com/rj/service/impl/DeviceManagementServiceImpl.java create mode 100644 src/main/java/com/rj/service/impl/ProjectManagementServiceImpl.java create mode 100644 src/main/java/com/rj/service/impl/SalesManagementServiceImpl.java create mode 100644 src/main/java/com/rj/service/impl/VideoManagementServiceImpl.java create mode 100644 src/main/resources/mapper/AudioManagementMapper.xml create mode 100644 src/main/resources/mapper/CustomerManagementMapper.xml create mode 100644 src/main/resources/mapper/DealershipMapper.xml create mode 100644 src/main/resources/mapper/DeviceManagementMapper.xml create mode 100644 src/main/resources/mapper/ProjectManagementMapper.xml create mode 100644 src/main/resources/mapper/SalesManagementMapper.xml create mode 100644 src/main/resources/mapper/VideoManagementMapper.xml diff --git a/src/main/java/com/rj/Langchain4jHeima20250803Application.java b/src/main/java/com/rj/Langchain4jHeima20250803Application.java index e2db2dd..3bd61a8 100644 --- a/src/main/java/com/rj/Langchain4jHeima20250803Application.java +++ b/src/main/java/com/rj/Langchain4jHeima20250803Application.java @@ -3,7 +3,7 @@ package com.rj; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; - +//http://localhost:8080/swagger-ui/index.html?urls.primaryName=public-api @MapperScan("com.rj.mapper") @SpringBootApplication public class Langchain4jHeima20250803Application { diff --git a/src/main/java/com/rj/aiservice/CstAIStreamingService.java b/src/main/java/com/rj/aiservice/CstAIStreamingService.java index 93ac45d..f35e0de 100644 --- a/src/main/java/com/rj/aiservice/CstAIStreamingService.java +++ b/src/main/java/com/rj/aiservice/CstAIStreamingService.java @@ -25,11 +25,11 @@ public interface CstAIStreamingService { @SystemMessage(fromResource = "system.txt") public Flux chat(String message); - @SystemMessage(fromResource = "system.txt") +// @SystemMessage(fromResource = "system.txt") public Flux chatMemoryId(@MemoryId String memoryId, @UserMessage String message); - @SystemMessage(fromResource = "system.txt") +// @SystemMessage(fromResource = "system.txt") public Flux chatMemoryIdRAG(@MemoryId String memoryId, @UserMessage String message); } diff --git a/src/main/java/com/rj/config/SwaggerOpenAPI.java b/src/main/java/com/rj/config/SwaggerOpenAPI.java index cb51ed5..603feb6 100644 --- a/src/main/java/com/rj/config/SwaggerOpenAPI.java +++ b/src/main/java/com/rj/config/SwaggerOpenAPI.java @@ -33,9 +33,6 @@ public class SwaggerOpenAPI { @Value("${swagger.api.base-url}") private String baseUrl; - @Value("${langchain4j.community.dashscope.chat-model.api-key}") - private String apiKey; - @Configuration public class JacksonConfig { diff --git a/src/main/java/com/rj/controller/AudioManagementController.java b/src/main/java/com/rj/controller/AudioManagementController.java new file mode 100644 index 0000000..04ae4de --- /dev/null +++ b/src/main/java/com/rj/controller/AudioManagementController.java @@ -0,0 +1,297 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.AudioManagement; +import com.rj.service.IAudioManagementService; +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.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 录音管理表,含信息卡字段 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/audioManagement") +@Tag(name = "录音管理", description = "录音管理相关接口") +public class AudioManagementController { + + @Autowired + private IAudioManagementService audioManagementService; + + /** + * 新增录音 + */ + @PostMapping("/add") + @Operation(summary = "新增录音", description = "添加新的录音信息") + public ResponseEntity> addAudio( + @Parameter(description = "录音信息", required = true) + @RequestBody AudioManagement audioManagement) { + Map result = new HashMap<>(); + try { + audioManagement.setCreateTime(LocalDateTime.now()); + audioManagement.setUpdateTime(LocalDateTime.now()); + boolean success = audioManagementService.save(audioManagement); + if (success) { + result.put("success", true); + result.put("message", "录音添加成功"); + result.put("data", audioManagement); + 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> getAudioById( + @Parameter(description = "录音ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + AudioManagement audio = audioManagementService.getById(id); + if (audio != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", audio); + 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("/getByCustomerPhone") + @Operation(summary = "根据客户手机号查询录音", description = "根据客户手机号查询录音信息") + public ResponseEntity> getAudioByCustomerPhone( + @Parameter(description = "客户手机号", required = true) + @RequestParam String customerPhone) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(AudioManagement::getCustomerPhone, customerPhone); + List audioList = audioManagementService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", audioList); + result.put("count", audioList.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> getAudioList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "录音名称(模糊查询)") + @RequestParam(required = false) String recordingName, + @Parameter(description = "客户手机号(模糊查询)") + @RequestParam(required = false) String customerPhone, + @Parameter(description = "所属门店ID") + @RequestParam(required = false) String dealershipId, + @Parameter(description = "意向级别") + @RequestParam(required = false) String intentionLevel) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (recordingName != null && !recordingName.trim().isEmpty()) { + queryWrapper.like(AudioManagement::getRecordingName, recordingName); + } + if (customerPhone != null && !customerPhone.trim().isEmpty()) { + queryWrapper.like(AudioManagement::getCustomerPhone, customerPhone); + } + if (dealershipId != null && !dealershipId.trim().isEmpty()) { + queryWrapper.eq(AudioManagement::getDealershipId, dealershipId); + } + if (intentionLevel != null && !intentionLevel.trim().isEmpty()) { + queryWrapper.eq(AudioManagement::getIntentionLevel, intentionLevel); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(AudioManagement::getCreateTime); + + Page audioPage = audioManagementService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", audioPage.getRecords()); + result.put("total", audioPage.getTotal()); + result.put("current", audioPage.getCurrent()); + result.put("size", audioPage.getSize()); + result.put("pages", audioPage.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> updateAudio( + @Parameter(description = "录音信息", required = true) + @RequestBody AudioManagement audioManagement) { + Map result = new HashMap<>(); + try { + if (audioManagement.getId() == null || audioManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "录音ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + audioManagement.setUpdateTime(LocalDateTime.now()); + boolean success = audioManagementService.updateById(audioManagement); + + if (success) { + result.put("success", true); + result.put("message", "录音信息更新成功"); + result.put("data", audioManagement); + 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> deleteAudio( + @Parameter(description = "录音ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = audioManagementService.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> batchDeleteAudios( + @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 = audioManagementService.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> getAudioStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = audioManagementService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalAudios", 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/CustomerManagementController.java b/src/main/java/com/rj/controller/CustomerManagementController.java new file mode 100644 index 0000000..174fc76 --- /dev/null +++ b/src/main/java/com/rj/controller/CustomerManagementController.java @@ -0,0 +1,291 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.CustomerManagement; +import com.rj.service.ICustomerManagementService; +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.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 客户管理表 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/customerManagement") +@Tag(name = "客户管理", description = "客户管理相关接口") +public class CustomerManagementController { + + @Autowired + private ICustomerManagementService customerManagementService; + + /** + * 新增客户 + */ + @PostMapping("/add") + @Operation(summary = "新增客户", description = "添加新的客户信息") + public ResponseEntity> addCustomer( + @Parameter(description = "客户信息", required = true) + @RequestBody CustomerManagement customerManagement) { + Map result = new HashMap<>(); + try { + customerManagement.setCreateTime(LocalDateTime.now()); + customerManagement.setUpdateTime(LocalDateTime.now()); + boolean success = customerManagementService.save(customerManagement); + if (success) { + result.put("success", true); + result.put("message", "客户添加成功"); + result.put("data", customerManagement); + 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> getCustomerById( + @Parameter(description = "客户ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + CustomerManagement customer = customerManagementService.getById(id); + if (customer != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", customer); + 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("/getByContact") + @Operation(summary = "根据联系方式查询客户", description = "根据客户联系方式查询客户信息") + public ResponseEntity> getCustomerByContact( + @Parameter(description = "联系方式", required = true) + @RequestParam String contact) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(CustomerManagement::getContact, contact); + List customers = customerManagementService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", customers); + result.put("count", customers.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> getCustomerList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "客户姓名(模糊查询)") + @RequestParam(required = false) String customerName, + @Parameter(description = "联系方式(模糊查询)") + @RequestParam(required = false) String contact, + @Parameter(description = "所属门店ID") + @RequestParam(required = false) String dealershipId) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (customerName != null && !customerName.trim().isEmpty()) { + queryWrapper.like(CustomerManagement::getCustomerName, customerName); + } + if (contact != null && !contact.trim().isEmpty()) { + queryWrapper.like(CustomerManagement::getContact, contact); + } + if (dealershipId != null && !dealershipId.trim().isEmpty()) { + queryWrapper.eq(CustomerManagement::getDealershipId, dealershipId); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(CustomerManagement::getCreateTime); + + Page customerPage = customerManagementService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", customerPage.getRecords()); + result.put("total", customerPage.getTotal()); + result.put("current", customerPage.getCurrent()); + result.put("size", customerPage.getSize()); + result.put("pages", customerPage.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> updateCustomer( + @Parameter(description = "客户信息", required = true) + @RequestBody CustomerManagement customerManagement) { + Map result = new HashMap<>(); + try { + if (customerManagement.getId() == null || customerManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "客户ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + customerManagement.setUpdateTime(LocalDateTime.now()); + boolean success = customerManagementService.updateById(customerManagement); + + if (success) { + result.put("success", true); + result.put("message", "客户信息更新成功"); + result.put("data", customerManagement); + 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> deleteCustomer( + @Parameter(description = "客户ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = customerManagementService.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> batchDeleteCustomers( + @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 = customerManagementService.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> getCustomerStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = customerManagementService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalCustomers", 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/DealershipController.java b/src/main/java/com/rj/controller/DealershipController.java new file mode 100644 index 0000000..1975384 --- /dev/null +++ b/src/main/java/com/rj/controller/DealershipController.java @@ -0,0 +1,297 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.Dealership; +import com.rj.service.IDealershipService; +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.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 汽车经销商门店信息表 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/dealership") +@Tag(name = "经销商管理", description = "经销商门店管理相关接口") +public class DealershipController { + + @Autowired + private IDealershipService dealershipService; + + /** + * 新增经销商 + */ + @PostMapping("/add") + @Operation(summary = "新增经销商", description = "添加新的经销商门店信息") + public ResponseEntity> addDealership( + @Parameter(description = "经销商信息", required = true) + @RequestBody Dealership dealership) { + Map result = new HashMap<>(); + try { + dealership.setCreateTime(LocalDateTime.now()); + dealership.setUpdateTime(LocalDateTime.now()); + boolean success = dealershipService.save(dealership); + if (success) { + result.put("success", true); + result.put("message", "经销商添加成功"); + result.put("data", dealership); + 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> getDealershipById( + @Parameter(description = "经销商ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + Dealership dealership = dealershipService.getById(id); + if (dealership != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", dealership); + 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("/getByCode") + @Operation(summary = "根据经销商代码查询", description = "根据经销商代码查询经销商信息") + public ResponseEntity> getDealershipByCode( + @Parameter(description = "经销商代码", required = true) + @RequestParam String dealershipCode) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Dealership::getDealershipCode, dealershipCode); + List dealershipList = dealershipService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", dealershipList); + result.put("count", dealershipList.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> getDealershipList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "经销商名称(模糊查询)") + @RequestParam(required = false) String dealershipName, + @Parameter(description = "经销商代码(模糊查询)") + @RequestParam(required = false) String dealershipCode, + @Parameter(description = "地区") + @RequestParam(required = false) String region, + @Parameter(description = "状态") + @RequestParam(required = false) Boolean status) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (dealershipName != null && !dealershipName.trim().isEmpty()) { + queryWrapper.like(Dealership::getDealershipName, dealershipName); + } + if (dealershipCode != null && !dealershipCode.trim().isEmpty()) { + queryWrapper.like(Dealership::getDealershipCode, dealershipCode); + } + if (region != null && !region.trim().isEmpty()) { + queryWrapper.eq(Dealership::getRegion, region); + } + if (status != null) { + queryWrapper.eq(Dealership::getStatus, status); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(Dealership::getCreateTime); + + Page dealershipPage = dealershipService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", dealershipPage.getRecords()); + result.put("total", dealershipPage.getTotal()); + result.put("current", dealershipPage.getCurrent()); + result.put("size", dealershipPage.getSize()); + result.put("pages", dealershipPage.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> updateDealership( + @Parameter(description = "经销商信息", required = true) + @RequestBody Dealership dealership) { + Map result = new HashMap<>(); + try { + if (dealership.getId() == null || dealership.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "经销商ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + dealership.setUpdateTime(LocalDateTime.now()); + boolean success = dealershipService.updateById(dealership); + + if (success) { + result.put("success", true); + result.put("message", "经销商信息更新成功"); + result.put("data", dealership); + 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> deleteDealership( + @Parameter(description = "经销商ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = dealershipService.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> batchDeleteDealerships( + @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 = dealershipService.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> getDealershipStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = dealershipService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalDealerships", 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/DeviceManagementController.java b/src/main/java/com/rj/controller/DeviceManagementController.java new file mode 100644 index 0000000..3c95333 --- /dev/null +++ b/src/main/java/com/rj/controller/DeviceManagementController.java @@ -0,0 +1,296 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.DeviceManagement; +import com.rj.service.IDeviceManagementService; +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.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 设备管理表 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/deviceManagement") +@Tag(name = "设备管理", description = "设备管理相关接口") +public class DeviceManagementController { + + @Autowired + private IDeviceManagementService deviceManagementService; + + /** + * 新增设备 + */ + @PostMapping("/add") + @Operation(summary = "新增设备", description = "添加新的设备信息") + public ResponseEntity> addDevice( + @Parameter(description = "设备信息", required = true) + @RequestBody DeviceManagement deviceManagement) { + Map result = new HashMap<>(); + try { + deviceManagement.setCreateTime(LocalDateTime.now()); + deviceManagement.setUpdateTime(LocalDateTime.now()); + boolean success = deviceManagementService.save(deviceManagement); + if (success) { + result.put("success", true); + result.put("message", "设备添加成功"); + result.put("data", deviceManagement); + 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> getDeviceById( + @Parameter(description = "设备ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + DeviceManagement device = deviceManagementService.getById(id); + if (device != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", device); + 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("/getByCode") + @Operation(summary = "根据设备编号查询", description = "根据设备编号查询设备信息") + public ResponseEntity> getDeviceByCode( + @Parameter(description = "设备编号", required = true) + @RequestParam String deviceCode) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(DeviceManagement::getDeviceCode, deviceCode); + List deviceList = deviceManagementService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", deviceList); + result.put("count", deviceList.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> getDeviceList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "设备编号(模糊查询)") + @RequestParam(required = false) String deviceCode, + @Parameter(description = "所属门店ID") + @RequestParam(required = false) String dealershipId, + @Parameter(description = "绑定状态") + @RequestParam(required = false) Boolean bindStatus, + @Parameter(description = "充电状态") + @RequestParam(required = false) String chargingStatus) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (deviceCode != null && !deviceCode.trim().isEmpty()) { + queryWrapper.like(DeviceManagement::getDeviceCode, deviceCode); + } + if (dealershipId != null && !dealershipId.trim().isEmpty()) { + queryWrapper.eq(DeviceManagement::getDealershipId, dealershipId); + } + if (bindStatus != null) { + queryWrapper.eq(DeviceManagement::getBindStatus, bindStatus); + } + if (chargingStatus != null && !chargingStatus.trim().isEmpty()) { + queryWrapper.eq(DeviceManagement::getChargingStatus, chargingStatus); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(DeviceManagement::getCreateTime); + + Page devicePage = deviceManagementService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", devicePage.getRecords()); + result.put("total", devicePage.getTotal()); + result.put("current", devicePage.getCurrent()); + result.put("size", devicePage.getSize()); + result.put("pages", devicePage.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> updateDevice( + @Parameter(description = "设备信息", required = true) + @RequestBody DeviceManagement deviceManagement) { + Map result = new HashMap<>(); + try { + if (deviceManagement.getId() == null || deviceManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "设备ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + deviceManagement.setUpdateTime(LocalDateTime.now()); + boolean success = deviceManagementService.updateById(deviceManagement); + + if (success) { + result.put("success", true); + result.put("message", "设备信息更新成功"); + result.put("data", deviceManagement); + 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> deleteDevice( + @Parameter(description = "设备ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = deviceManagementService.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> batchDeleteDevices( + @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 = deviceManagementService.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> getDeviceStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = deviceManagementService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalDevices", 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/ProjectManagementController.java b/src/main/java/com/rj/controller/ProjectManagementController.java new file mode 100644 index 0000000..a98e48b --- /dev/null +++ b/src/main/java/com/rj/controller/ProjectManagementController.java @@ -0,0 +1,297 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.ProjectManagement; +import com.rj.service.IProjectManagementService; +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.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 项目管理表 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/projectManagement") +@Tag(name = "项目管理", description = "项目管理相关接口") +public class ProjectManagementController { + + @Autowired + private IProjectManagementService projectManagementService; + + /** + * 新增项目 + */ + @PostMapping("/add") + @Operation(summary = "新增项目", description = "添加新的项目信息") + public ResponseEntity> addProject( + @Parameter(description = "项目信息", required = true) + @RequestBody ProjectManagement projectManagement) { + Map result = new HashMap<>(); + try { + projectManagement.setCreateTime(LocalDateTime.now()); + projectManagement.setUpdateTime(LocalDateTime.now()); + boolean success = projectManagementService.save(projectManagement); + if (success) { + result.put("success", true); + result.put("message", "项目添加成功"); + result.put("data", projectManagement); + 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> getProjectById( + @Parameter(description = "项目ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + ProjectManagement project = projectManagementService.getById(id); + if (project != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", project); + 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> getProjectByName( + @Parameter(description = "项目名称", required = true) + @RequestParam String projectName) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(ProjectManagement::getProjectName, projectName); + List projectList = projectManagementService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", projectList); + result.put("count", projectList.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> getProjectList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "项目名称(模糊查询)") + @RequestParam(required = false) String projectName, + @Parameter(description = "所属经销商ID") + @RequestParam(required = false) String dealershipId, + @Parameter(description = "项目状态") + @RequestParam(required = false) Boolean status, + @Parameter(description = "分组") + @RequestParam(required = false) String groupName) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (projectName != null && !projectName.trim().isEmpty()) { + queryWrapper.like(ProjectManagement::getProjectName, projectName); + } + if (dealershipId != null && !dealershipId.trim().isEmpty()) { + queryWrapper.eq(ProjectManagement::getDealershipId, dealershipId); + } + if (status != null) { + queryWrapper.eq(ProjectManagement::getStatus, status); + } + if (groupName != null && !groupName.trim().isEmpty()) { + queryWrapper.eq(ProjectManagement::getGroupName, groupName); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(ProjectManagement::getCreateTime); + + Page projectPage = projectManagementService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", projectPage.getRecords()); + result.put("total", projectPage.getTotal()); + result.put("current", projectPage.getCurrent()); + result.put("size", projectPage.getSize()); + result.put("pages", projectPage.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> updateProject( + @Parameter(description = "项目信息", required = true) + @RequestBody ProjectManagement projectManagement) { + Map result = new HashMap<>(); + try { + if (projectManagement.getId() == null || projectManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "项目ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + projectManagement.setUpdateTime(LocalDateTime.now()); + boolean success = projectManagementService.updateById(projectManagement); + + if (success) { + result.put("success", true); + result.put("message", "项目信息更新成功"); + result.put("data", projectManagement); + 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> deleteProject( + @Parameter(description = "项目ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = projectManagementService.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> batchDeleteProjects( + @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 = projectManagementService.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> getProjectStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = projectManagementService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalProjects", 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/SalesManagementController.java b/src/main/java/com/rj/controller/SalesManagementController.java new file mode 100644 index 0000000..c427988 --- /dev/null +++ b/src/main/java/com/rj/controller/SalesManagementController.java @@ -0,0 +1,302 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.SalesManagement; +import com.rj.service.ISalesManagementService; +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.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 销售管理表 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/salesManagement") +@Tag(name = "销售管理", description = "销售管理相关接口") +public class SalesManagementController { + + @Autowired + private ISalesManagementService salesManagementService; + + /** + * 新增销售 + */ + @PostMapping("/add") + @Operation(summary = "新增销售", description = "添加新的销售信息") + public ResponseEntity> addSales( + @Parameter(description = "销售信息", required = true) + @RequestBody SalesManagement salesManagement) { + Map result = new HashMap<>(); + try { + salesManagement.setCreateTime(LocalDateTime.now()); + salesManagement.setUpdateTime(LocalDateTime.now()); + boolean success = salesManagementService.save(salesManagement); + if (success) { + result.put("success", true); + result.put("message", "销售添加成功"); + result.put("data", salesManagement); + 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> getSalesById( + @Parameter(description = "销售ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + SalesManagement sales = salesManagementService.getById(id); + if (sales != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", sales); + 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("/getByAccount") + @Operation(summary = "根据登录账号查询销售", description = "根据销售登录账号查询销售信息") + public ResponseEntity> getSalesByAccount( + @Parameter(description = "登录账号", required = true) + @RequestParam String loginAccount) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SalesManagement::getLoginAccount, loginAccount); + List salesList = salesManagementService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", salesList); + result.put("count", salesList.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> getSalesList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "销售名称(模糊查询)") + @RequestParam(required = false) String salesName, + @Parameter(description = "登录账号(模糊查询)") + @RequestParam(required = false) String loginAccount, + @Parameter(description = "所属门店ID") + @RequestParam(required = false) String dealershipId, + @Parameter(description = "销售状态") + @RequestParam(required = false) Boolean status, + @Parameter(description = "角色") + @RequestParam(required = false) String role) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (salesName != null && !salesName.trim().isEmpty()) { + queryWrapper.like(SalesManagement::getSalesName, salesName); + } + if (loginAccount != null && !loginAccount.trim().isEmpty()) { + queryWrapper.like(SalesManagement::getLoginAccount, loginAccount); + } + if (dealershipId != null && !dealershipId.trim().isEmpty()) { + queryWrapper.eq(SalesManagement::getDealershipId, dealershipId); + } + if (status != null) { + queryWrapper.eq(SalesManagement::getStatus, status); + } + if (role != null && !role.trim().isEmpty()) { + queryWrapper.eq(SalesManagement::getRole, role); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(SalesManagement::getCreateTime); + + Page salesPage = salesManagementService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", salesPage.getRecords()); + result.put("total", salesPage.getTotal()); + result.put("current", salesPage.getCurrent()); + result.put("size", salesPage.getSize()); + result.put("pages", salesPage.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> updateSales( + @Parameter(description = "销售信息", required = true) + @RequestBody SalesManagement salesManagement) { + Map result = new HashMap<>(); + try { + if (salesManagement.getId() == null || salesManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "销售ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + salesManagement.setUpdateTime(LocalDateTime.now()); + boolean success = salesManagementService.updateById(salesManagement); + + if (success) { + result.put("success", true); + result.put("message", "销售信息更新成功"); + result.put("data", salesManagement); + 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> deleteSales( + @Parameter(description = "销售ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = salesManagementService.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> batchDeleteSales( + @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 = salesManagementService.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> getSalesStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = salesManagementService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalSales", 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/VideoManagementController.java b/src/main/java/com/rj/controller/VideoManagementController.java new file mode 100644 index 0000000..25affe9 --- /dev/null +++ b/src/main/java/com/rj/controller/VideoManagementController.java @@ -0,0 +1,301 @@ +package com.rj.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.rj.entity.VideoManagement; +import com.rj.service.IVideoManagementService; +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.math.BigDecimal; +import java.time.LocalDateTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + *

+ * 视频管理表 前端控制器 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@RestController +@RequestMapping("/api/videoManagement") +@Tag(name = "视频管理", description = "视频管理相关接口") +public class VideoManagementController { + + @Autowired + private IVideoManagementService videoManagementService; + + /** + * 新增视频 + */ + @PostMapping("/add") + @Operation(summary = "新增视频", description = "添加新的视频信息") + public ResponseEntity> addVideo( + @Parameter(description = "视频信息", required = true) + @RequestBody VideoManagement videoManagement) { + Map result = new HashMap<>(); + try { + videoManagement.setCreateTime(LocalDateTime.now()); + videoManagement.setUpdateTime(LocalDateTime.now()); + boolean success = videoManagementService.save(videoManagement); + if (success) { + result.put("success", true); + result.put("message", "视频添加成功"); + result.put("data", videoManagement); + 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> getVideoById( + @Parameter(description = "视频ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + VideoManagement video = videoManagementService.getById(id); + if (video != null) { + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", video); + 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("/getByCustomerPhone") + @Operation(summary = "根据客户手机号查询视频", description = "根据客户手机号查询视频信息") + public ResponseEntity> getVideoByCustomerPhone( + @Parameter(description = "客户手机号", required = true) + @RequestParam String customerPhone) { + Map result = new HashMap<>(); + try { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(VideoManagement::getCustomerPhone, customerPhone); + List videoList = videoManagementService.list(queryWrapper); + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", videoList); + result.put("count", videoList.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> getVideoList( + @Parameter(description = "页码", example = "1") + @RequestParam(defaultValue = "1") Integer current, + @Parameter(description = "每页大小", example = "10") + @RequestParam(defaultValue = "10") Integer size, + @Parameter(description = "视频名称(模糊查询)") + @RequestParam(required = false) String videoName, + @Parameter(description = "客户手机号(模糊查询)") + @RequestParam(required = false) String customerPhone, + @Parameter(description = "所属门店ID") + @RequestParam(required = false) String dealershipId, + @Parameter(description = "所属销售ID") + @RequestParam(required = false) String salesId) { + Map result = new HashMap<>(); + try { + Page page = new Page<>(current, size); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + + // 添加查询条件 + if (videoName != null && !videoName.trim().isEmpty()) { + queryWrapper.like(VideoManagement::getVideoName, videoName); + } + if (customerPhone != null && !customerPhone.trim().isEmpty()) { + queryWrapper.like(VideoManagement::getCustomerPhone, customerPhone); + } + if (dealershipId != null && !dealershipId.trim().isEmpty()) { + queryWrapper.eq(VideoManagement::getDealershipId, dealershipId); + } + if (salesId != null && !salesId.trim().isEmpty()) { + queryWrapper.eq(VideoManagement::getSalesId, salesId); + } + + // 按创建时间倒序排列 + queryWrapper.orderByDesc(VideoManagement::getCreateTime); + + Page videoPage = videoManagementService.page(page, queryWrapper); + + result.put("success", true); + result.put("message", "查询成功"); + result.put("data", videoPage.getRecords()); + result.put("total", videoPage.getTotal()); + result.put("current", videoPage.getCurrent()); + result.put("size", videoPage.getSize()); + result.put("pages", videoPage.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> updateVideo( + @Parameter(description = "视频信息", required = true) + @RequestBody VideoManagement videoManagement) { + Map result = new HashMap<>(); + try { + if (videoManagement.getId() == null || videoManagement.getId().trim().isEmpty()) { + result.put("success", false); + result.put("message", "视频ID不能为空"); + return ResponseEntity.badRequest().body(result); + } + + videoManagement.setUpdateTime(LocalDateTime.now()); + boolean success = videoManagementService.updateById(videoManagement); + + if (success) { + result.put("success", true); + result.put("message", "视频信息更新成功"); + result.put("data", videoManagement); + 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> deleteVideo( + @Parameter(description = "视频ID", required = true) + @PathVariable String id) { + Map result = new HashMap<>(); + try { + boolean success = videoManagementService.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> batchDeleteVideos( + @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 = videoManagementService.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> getVideoStatistics() { + Map result = new HashMap<>(); + try { + long totalCount = videoManagementService.count(); + + Map statistics = new HashMap<>(); + statistics.put("totalVideos", 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/embedding/EnbedingModelConfig.java b/src/main/java/com/rj/embedding/EnbedingModelConfig.java index df8884b..660ca72 100644 --- a/src/main/java/com/rj/embedding/EnbedingModelConfig.java +++ b/src/main/java/com/rj/embedding/EnbedingModelConfig.java @@ -88,7 +88,7 @@ public class EnbedingModelConfig { // @Bean("myEmbeddingStoreInRedis") 不要打开,否则每次都会调用 阿里云的向量化模型 ,消耗token // @Primary - public EmbeddingStore embeddingStoreInRedis() throws IOException { + public EmbeddingStore embeddingStoreInRedis(EmbeddingStore redisEmbeddingStore) throws IOException { //1 , 加载知识库文档进 内存 List documents1 = ClassPathDocumentLoader.loadDocuments("knowledge\\pdf",new ApachePdfBoxDocumentParser()); // List documents2 = ClassPathDocumentLoader.loadDocuments("knowledge"); @@ -107,9 +107,10 @@ public class EnbedingModelConfig { } @Bean - public ContentRetriever contentRetriever(){ + public ContentRetriever contentRetriever(@Qualifier("myEmbeddingStoreInMemory")EmbeddingStore store){ EmbeddingStoreContentRetriever contentRetriever = EmbeddingStoreContentRetriever.builder() - .embeddingStore(redisEmbeddingStore) +// .embeddingStore(redisEmbeddingStore) + .embeddingStore( redisEmbeddingStore) .embeddingModel(embeddingModel) .minScore(0.5)//相似度 .maxResults(3) //最多返回3条 diff --git a/src/main/java/com/rj/mapper/AudioManagementMapper.java b/src/main/java/com/rj/mapper/AudioManagementMapper.java new file mode 100644 index 0000000..a753df5 --- /dev/null +++ b/src/main/java/com/rj/mapper/AudioManagementMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.AudioManagement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 录音管理表,含信息卡字段 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface AudioManagementMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/CustomerManagementMapper.java b/src/main/java/com/rj/mapper/CustomerManagementMapper.java new file mode 100644 index 0000000..e227e43 --- /dev/null +++ b/src/main/java/com/rj/mapper/CustomerManagementMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.CustomerManagement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 客户管理表 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface CustomerManagementMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/DealershipMapper.java b/src/main/java/com/rj/mapper/DealershipMapper.java new file mode 100644 index 0000000..9ee505e --- /dev/null +++ b/src/main/java/com/rj/mapper/DealershipMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.Dealership; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 汽车经销商门店信息表 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface DealershipMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/DeviceManagementMapper.java b/src/main/java/com/rj/mapper/DeviceManagementMapper.java new file mode 100644 index 0000000..e01ab2f --- /dev/null +++ b/src/main/java/com/rj/mapper/DeviceManagementMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.DeviceManagement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 设备管理表 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface DeviceManagementMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/ProjectManagementMapper.java b/src/main/java/com/rj/mapper/ProjectManagementMapper.java new file mode 100644 index 0000000..d200753 --- /dev/null +++ b/src/main/java/com/rj/mapper/ProjectManagementMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.ProjectManagement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 项目管理表 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface ProjectManagementMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/SalesManagementMapper.java b/src/main/java/com/rj/mapper/SalesManagementMapper.java new file mode 100644 index 0000000..0287b5a --- /dev/null +++ b/src/main/java/com/rj/mapper/SalesManagementMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.SalesManagement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 销售管理表 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface SalesManagementMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/mapper/VideoManagementMapper.java b/src/main/java/com/rj/mapper/VideoManagementMapper.java new file mode 100644 index 0000000..33d6005 --- /dev/null +++ b/src/main/java/com/rj/mapper/VideoManagementMapper.java @@ -0,0 +1,16 @@ +package com.rj.mapper; + +import com.rj.entity.VideoManagement; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** + *

+ * 视频管理表 Mapper 接口 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface VideoManagementMapper extends BaseMapper { + +} diff --git a/src/main/java/com/rj/service/IAudioManagementService.java b/src/main/java/com/rj/service/IAudioManagementService.java new file mode 100644 index 0000000..3872fbb --- /dev/null +++ b/src/main/java/com/rj/service/IAudioManagementService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.AudioManagement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 录音管理表,含信息卡字段 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface IAudioManagementService extends IService { + +} diff --git a/src/main/java/com/rj/service/ICustomerManagementService.java b/src/main/java/com/rj/service/ICustomerManagementService.java new file mode 100644 index 0000000..e00898a --- /dev/null +++ b/src/main/java/com/rj/service/ICustomerManagementService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.CustomerManagement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 客户管理表 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface ICustomerManagementService extends IService { + +} diff --git a/src/main/java/com/rj/service/IDealershipService.java b/src/main/java/com/rj/service/IDealershipService.java new file mode 100644 index 0000000..d054128 --- /dev/null +++ b/src/main/java/com/rj/service/IDealershipService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.Dealership; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 汽车经销商门店信息表 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface IDealershipService extends IService { + +} diff --git a/src/main/java/com/rj/service/IDeviceManagementService.java b/src/main/java/com/rj/service/IDeviceManagementService.java new file mode 100644 index 0000000..b808b45 --- /dev/null +++ b/src/main/java/com/rj/service/IDeviceManagementService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.DeviceManagement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 设备管理表 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface IDeviceManagementService extends IService { + +} diff --git a/src/main/java/com/rj/service/IProjectManagementService.java b/src/main/java/com/rj/service/IProjectManagementService.java new file mode 100644 index 0000000..0004746 --- /dev/null +++ b/src/main/java/com/rj/service/IProjectManagementService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.ProjectManagement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 项目管理表 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface IProjectManagementService extends IService { + +} diff --git a/src/main/java/com/rj/service/ISalesManagementService.java b/src/main/java/com/rj/service/ISalesManagementService.java new file mode 100644 index 0000000..41ac830 --- /dev/null +++ b/src/main/java/com/rj/service/ISalesManagementService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.SalesManagement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 销售管理表 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface ISalesManagementService extends IService { + +} diff --git a/src/main/java/com/rj/service/IVideoManagementService.java b/src/main/java/com/rj/service/IVideoManagementService.java new file mode 100644 index 0000000..bf9195c --- /dev/null +++ b/src/main/java/com/rj/service/IVideoManagementService.java @@ -0,0 +1,16 @@ +package com.rj.service; + +import com.rj.entity.VideoManagement; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + *

+ * 视频管理表 服务类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +public interface IVideoManagementService extends IService { + +} diff --git a/src/main/java/com/rj/service/impl/AudioManagementServiceImpl.java b/src/main/java/com/rj/service/impl/AudioManagementServiceImpl.java new file mode 100644 index 0000000..a429239 --- /dev/null +++ b/src/main/java/com/rj/service/impl/AudioManagementServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.AudioManagement; +import com.rj.mapper.AudioManagementMapper; +import com.rj.service.IAudioManagementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 录音管理表,含信息卡字段 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class AudioManagementServiceImpl extends ServiceImpl implements IAudioManagementService { + +} diff --git a/src/main/java/com/rj/service/impl/CustomerManagementServiceImpl.java b/src/main/java/com/rj/service/impl/CustomerManagementServiceImpl.java new file mode 100644 index 0000000..3f12a34 --- /dev/null +++ b/src/main/java/com/rj/service/impl/CustomerManagementServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.CustomerManagement; +import com.rj.mapper.CustomerManagementMapper; +import com.rj.service.ICustomerManagementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 客户管理表 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class CustomerManagementServiceImpl extends ServiceImpl implements ICustomerManagementService { + +} diff --git a/src/main/java/com/rj/service/impl/DealershipServiceImpl.java b/src/main/java/com/rj/service/impl/DealershipServiceImpl.java new file mode 100644 index 0000000..ff0009a --- /dev/null +++ b/src/main/java/com/rj/service/impl/DealershipServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.Dealership; +import com.rj.mapper.DealershipMapper; +import com.rj.service.IDealershipService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 汽车经销商门店信息表 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class DealershipServiceImpl extends ServiceImpl implements IDealershipService { + +} diff --git a/src/main/java/com/rj/service/impl/DeviceManagementServiceImpl.java b/src/main/java/com/rj/service/impl/DeviceManagementServiceImpl.java new file mode 100644 index 0000000..64edd55 --- /dev/null +++ b/src/main/java/com/rj/service/impl/DeviceManagementServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.DeviceManagement; +import com.rj.mapper.DeviceManagementMapper; +import com.rj.service.IDeviceManagementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 设备管理表 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class DeviceManagementServiceImpl extends ServiceImpl implements IDeviceManagementService { + +} diff --git a/src/main/java/com/rj/service/impl/ProjectManagementServiceImpl.java b/src/main/java/com/rj/service/impl/ProjectManagementServiceImpl.java new file mode 100644 index 0000000..a52d4ba --- /dev/null +++ b/src/main/java/com/rj/service/impl/ProjectManagementServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.ProjectManagement; +import com.rj.mapper.ProjectManagementMapper; +import com.rj.service.IProjectManagementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 项目管理表 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class ProjectManagementServiceImpl extends ServiceImpl implements IProjectManagementService { + +} diff --git a/src/main/java/com/rj/service/impl/SalesManagementServiceImpl.java b/src/main/java/com/rj/service/impl/SalesManagementServiceImpl.java new file mode 100644 index 0000000..178b2ab --- /dev/null +++ b/src/main/java/com/rj/service/impl/SalesManagementServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.SalesManagement; +import com.rj.mapper.SalesManagementMapper; +import com.rj.service.ISalesManagementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 销售管理表 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class SalesManagementServiceImpl extends ServiceImpl implements ISalesManagementService { + +} diff --git a/src/main/java/com/rj/service/impl/VideoManagementServiceImpl.java b/src/main/java/com/rj/service/impl/VideoManagementServiceImpl.java new file mode 100644 index 0000000..a737856 --- /dev/null +++ b/src/main/java/com/rj/service/impl/VideoManagementServiceImpl.java @@ -0,0 +1,20 @@ +package com.rj.service.impl; + +import com.rj.entity.VideoManagement; +import com.rj.mapper.VideoManagementMapper; +import com.rj.service.IVideoManagementService; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; + +/** + *

+ * 视频管理表 服务实现类 + *

+ * + * @author 李中华 ,spllzh + * @since 2025-08-07 + */ +@Service +public class VideoManagementServiceImpl extends ServiceImpl implements IVideoManagementService { + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0073e3c..19ccb81 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,4 @@ + langchain4j: open-ai: chat-model: @@ -28,6 +29,18 @@ langchain4j: logging: level: dev.langchain4j: DEBUG + # MyBatis Plus SQL日志 + com.baomidou.mybatisplus: DEBUG + # MyBatis SQL日志 + com.rj.mapper: DEBUG + # 数据库连接池日志 + com.zaxxer.hikari: DEBUG + # Spring JDBC日志 + org.springframework.jdbc: DEBUG + # 显示SQL参数 + com.baomidou.mybatisplus.core.executor: DEBUG + # 显示SQL执行时间 + com.baomidou.mybatisplus.core.toolkit: DEBUG spring: @@ -39,7 +52,7 @@ spring: database: 0 datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://124.221.59.58:3309/rj_user_clue?useUnicode=true&characterEncoding=utf8 + url: jdbc:mysql://124.221.59.58:3309/ai_smart_badge?useUnicode=true&characterEncoding=utf8 username: root password: ChangAndb.123! hikari: @@ -54,7 +67,24 @@ spring: mybatis: configuration: + # 开启SQL日志 - 这是最重要的配置 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + # 开启驼峰命名转换 map-underscore-to-camel-case: true + # 开启自动生成主键 + use-generated-keys: true + # 开启日志前缀 + log-prefix: "MyBatis SQL: " + # MyBatis Plus 全局配置 + global-config: + db-config: + # 主键类型 + id-type: ASSIGN_UUID + # 逻辑删除配置 + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + knife4j: # 开启增强模式 @@ -78,7 +108,9 @@ springdoc: default-consumes-media-type: application/json default-produces-media-type: application/json - swagger: +swagger: api: base-url: http://localhost:9060 - +# http://localhost:9060/swagger-ui/index.html?urls.primaryName=public-api +server: + port: 9060 diff --git a/src/main/resources/mapper/AudioManagementMapper.xml b/src/main/resources/mapper/AudioManagementMapper.xml new file mode 100644 index 0000000..d26c769 --- /dev/null +++ b/src/main/resources/mapper/AudioManagementMapper.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, recording_name, recording_time, sales_id, sales_name, duration, customer_id, customer_name, customer_phone, upload_time, intention_level, dealership_id, dealership_name, project_id, project_name, script_model, upload_status, sync_status, is_merged, remarks, company_type, edit_status, edit_time, info_card_type, info_card_value, create_time, update_time + + + diff --git a/src/main/resources/mapper/CustomerManagementMapper.xml b/src/main/resources/mapper/CustomerManagementMapper.xml new file mode 100644 index 0000000..66013e6 --- /dev/null +++ b/src/main/resources/mapper/CustomerManagementMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + id, customer_name, contact, dealership_id, dealership_name, sales_id, sales_name, recording_count, intended_model, info_card, create_time, update_time + + + diff --git a/src/main/resources/mapper/DealershipMapper.xml b/src/main/resources/mapper/DealershipMapper.xml new file mode 100644 index 0000000..fb1d5fb --- /dev/null +++ b/src/main/resources/mapper/DealershipMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, dealership_name, dealership_code, remaining_hours, sales_count, avg_recordings, avg_recording_duration, region, group_name, language, dealership_type, status, create_time, update_time + + + diff --git a/src/main/resources/mapper/DeviceManagementMapper.xml b/src/main/resources/mapper/DeviceManagementMapper.xml new file mode 100644 index 0000000..ecec4af --- /dev/null +++ b/src/main/resources/mapper/DeviceManagementMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, device_code, dealership_id, dealership_name, last_online_time, last_power_on_time, last_power_off_time, wifi_name, unuploaded_count, storage_size, storage_used, remaining_battery, charging_status, bind_user_id, bind_user_name, project_id, project_name, bind_status, create_time, update_time + + + diff --git a/src/main/resources/mapper/ProjectManagementMapper.xml b/src/main/resources/mapper/ProjectManagementMapper.xml new file mode 100644 index 0000000..5a9c0fe --- /dev/null +++ b/src/main/resources/mapper/ProjectManagementMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, dealership_id, project_name, script_version, script_publish_time, salesperson_count, avg_recording_duration, step, group_name, create_time, description, status, update_time + + + diff --git a/src/main/resources/mapper/SalesManagementMapper.xml b/src/main/resources/mapper/SalesManagementMapper.xml new file mode 100644 index 0000000..95572a9 --- /dev/null +++ b/src/main/resources/mapper/SalesManagementMapper.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + id, sales_name, login_account, recording_count, avg_recording_duration, total_recording_hours, project_id, project_name, dealership_id, dealership_name, role, create_time, last_recording_time, last_login_time, last_login_ip, status, update_time + + + diff --git a/src/main/resources/mapper/VideoManagementMapper.xml b/src/main/resources/mapper/VideoManagementMapper.xml new file mode 100644 index 0000000..d7948fb --- /dev/null +++ b/src/main/resources/mapper/VideoManagementMapper.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + id, video_name, dealership_id, dealership_name, sales_id, sales_name, customer_id, customer_name, customer_phone, duration, record_time, create_time, update_time + + +