From d097cca97b1ab6717b37bce5cd48cca1c5ab69a1 Mon Sep 17 00:00:00 2001 From: guyue <1721849008@qq.com> Date: 星期三, 09 七月 2025 19:36:05 +0800 Subject: [PATCH] 提问词excel,获取客户列表, --- src/main/java/com/linghu/controller/PlatformController.java | 20 ++ /dev/null | 18 -- src/main/java/com/linghu/controller/CollectController.java | 24 +- src/main/java/com/linghu/controller/AuthController.java | 68 ++++---- src/main/java/com/linghu/controller/OrderController.java | 51 ++++++ src/main/java/com/linghu/service/OrderService.java | 5 src/main/java/com/linghu/service/impl/OrderServiceImpl.java | 44 ++++++ src/main/java/com/linghu/controller/QuestionController.java | 122 +++++++++++++---- src/main/java/com/linghu/listener/QuestionExcelListener.java | 28 ++++ src/main/java/com/linghu/model/excel/QuestionExcel.java | 10 + 10 files changed, 283 insertions(+), 107 deletions(-) diff --git a/src/main/java/com/linghu/config/MybatisPlusConfig.java b/src/main/java/com/linghu/config/MybatisPlusConfig.java deleted file mode 100644 index bb1be96..0000000 --- a/src/main/java/com/linghu/config/MybatisPlusConfig.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.linghu.config; - -import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; -import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -@Configuration -public class MyBatisPlusConfig { - - @Bean - public MybatisPlusInterceptor mybatisPlusInterceptor() { - MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); - // 添加分页插件,这里可指定数据库类型(如 MySQL),也可默认 - interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); - return interceptor; - } -} \ No newline at end of file diff --git a/src/main/java/com/linghu/controller/AuthController.java b/src/main/java/com/linghu/controller/AuthController.java index aa7f072..57547b5 100644 --- a/src/main/java/com/linghu/controller/AuthController.java +++ b/src/main/java/com/linghu/controller/AuthController.java @@ -21,31 +21,31 @@ @Value("${jwt.secret}") private String secretKey; - @PostMapping("/login") - @ApiOperation(value = "外部登录") - public ResponseEntity<?> externalLogin( - @RequestBody User user) { - - // 生成JWT令牌 - JwtUtils jwtUtils = new JwtUtils(secretKey, 3600); - String token = jwtUtils.generateToken(user); - - Map<String, String> response = new HashMap<>(); - response.put("token", token); - // 返回JWT令牌 - return ResponseEntity.ok(response); - } +// @PostMapping("/login") +// @ApiOperation(value = "外部登录") +// public ResponseEntity<?> externalLogin( +// @RequestBody User user) { +// +// // 生成JWT令牌 +// JwtUtils jwtUtils = new JwtUtils(secretKey, 3600); +// String token = jwtUtils.generateToken(user); +// +// Map<String, String> response = new HashMap<>(); +// response.put("token", token); +// // 返回JWT令牌 +// return ResponseEntity.ok(response); +// } // 获取用户信息 - @PostMapping("/getUserInfo") - @ApiOperation(value = "获取用户信息") - public ResponseEntity<?> getUserInfo(@RequestParam String token) { - // 解析JWT令牌,获取用户信息 - JwtUtils jwtUtils = new JwtUtils(secretKey, 3600); - User user = jwtUtils.parseToken(token); - // 返回用户信息 - return ResponseEntity.ok(user); - } +// @PostMapping("/getUserInfo") +// @ApiOperation(value = "获取用户信息") +// public ResponseEntity<?> getUserInfo(@RequestParam String token) { +// // 解析JWT令牌,获取用户信息 +// JwtUtils jwtUtils = new JwtUtils(secretKey, 3600); +// User user = jwtUtils.parseToken(token); +// // 返回用户信息 +// return ResponseEntity.ok(user); +// } //open-crypt解析token @GetMapping("/parseToken") @ApiOperation(value = "解析token") @@ -63,15 +63,15 @@ return ResponseEntity.ok(decrypt); } - @GetMapping("/getToken") - @ApiOperation(value = "获取token") - public ResponseEntity<?> getToken(@RequestBody User user) { - // 创建用户对 - - // 创建JwtUtils对象,并生成JWT令牌 - OpenCryptUtil openCryptUtil = new OpenCryptUtil(); - String decrypt = openCryptUtil.encrypt(user); - // 返回JWT令牌 - return ResponseEntity.ok(decrypt); - } +// @GetMapping("/getToken") +// @ApiOperation(value = "获取token") +// public ResponseEntity<?> getToken(@RequestBody User user) { +// // 创建用户对 +// +// // 创建JwtUtils对象,并生成JWT令牌 +// OpenCryptUtil openCryptUtil = new OpenCryptUtil(); +// String decrypt = openCryptUtil.encrypt(user); +// // 返回JWT令牌 +// return ResponseEntity.ok(decrypt); +// } } \ No newline at end of file diff --git a/src/main/java/com/linghu/controller/CollectController.java b/src/main/java/com/linghu/controller/CollectController.java index e3bab81..4df7b80 100644 --- a/src/main/java/com/linghu/controller/CollectController.java +++ b/src/main/java/com/linghu/controller/CollectController.java @@ -73,19 +73,17 @@ public Mono<SearchTaskResponse> createSearchTask( @RequestBody SearchTaskRequest searchTaskRequest, HttpServletRequest request) throws JsonProcessingException { - String token = request.getHeader("Authorization"); - User user = jwtUtils.parseToken(token); - // 复制到UserDto - UserDto userDto = new UserDto(); - userDto.setName(user.getUser_name()); - userDto.setEmail(user.getUser_email()); - userDto.setPassword(user.getPassword()); - - // List<User> users = new ArrayList<>(); - // users.add(user); - List<UserDto> users = new ArrayList<>(); - users.add(userDto); - searchTaskRequest.setUsers(users); +// String token = request.getHeader("Authorization"); +// User user = jwtUtils.parseToken(token); +// // 复制到UserDto +// UserDto userDto = new UserDto(); +// userDto.setName(user.getUser_name()); +// userDto.setEmail(user.getUser_email()); +// userDto.setPassword(user.getPassword()); +// +// List<UserDto> users = new ArrayList<>(); +// users.add(userDto); +// searchTaskRequest.setUsers(users); // json格式 ObjectMapper objectMapper = new ObjectMapper(); System.out.println(objectMapper.writeValueAsString(searchTaskRequest)); diff --git a/src/main/java/com/linghu/controller/OrderController.java b/src/main/java/com/linghu/controller/OrderController.java index 3b7fb30..a26b7d2 100644 --- a/src/main/java/com/linghu/controller/OrderController.java +++ b/src/main/java/com/linghu/controller/OrderController.java @@ -18,6 +18,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; +import javax.servlet.http.HttpServletRequest; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.Date; @@ -169,7 +170,7 @@ @RequestParam(required = false) Integer pageSize, @RequestParam(required = false) String clientName, @RequestParam(required = false) Integer status, - @RequestParam(required = false) String createTime) { + @RequestParam(required = false) String timeRange) { LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(Orders::getDel_flag, 0); @@ -181,10 +182,32 @@ if (status != null) { queryWrapper.eq(Orders::getStatus, status); } - if (createTime != null) { - queryWrapper.like(Orders::getCreate_time, createTime); - } + // 改造时间筛选逻辑 + if (timeRange != null && !timeRange.trim().isEmpty()) { + LocalDateTime now = LocalDateTime.now(); + LocalDateTime startTime = null; + switch (timeRange.trim()) { + case "week": + startTime = now.minusWeeks(1); + break; + case "month": + startTime = now.minusMonths(1); + break; + case "threeMonths": + startTime = now.minusMonths(3); + break; + case "year": + startTime = now.minusYears(1); + break; + default: + // 可添加日志记录无效参数 + break; + } + if (startTime != null) { + queryWrapper.ge(Orders::getCreate_time, startTime); + } + } // 分页查询 if (pageNum != null && pageSize != null) { Page<Orders> pageInfo = new Page<>(pageNum, pageSize); @@ -201,9 +224,27 @@ return ResponseResult.success(page); } + /** + * 获取客户列表 + * @param + * @return + */ + @GetMapping("/clientList") + @ApiOperation("获取客户列表") + public ResponseResult<CustomPage<String>> getClientList(@RequestParam(required = false) String clientName, + @RequestParam(required = false,defaultValue = "1") Integer pageNum, + @RequestParam(required = false, defaultValue = "10") Integer pageSize) { + + Page<String> result = orderService.getClientList(clientName,pageNum, pageSize); + + + return ResponseResult.success(new CustomPage<>( result)); + } + + @GetMapping("/{orderId}/keywordList") @ApiOperation("获取订单关联的关键词及提问词") - public ResponseResult<List<KeywordDto>> getKeywordList(@PathVariable String orderId) { + public ResponseResult<List<KeywordDto>> getKeywordList(@PathVariable String orderId){ List<KeywordDto> result = orderService.getKeywordListByOrderId(orderId); return ResponseResult.success(result); } diff --git a/src/main/java/com/linghu/controller/PlatformController.java b/src/main/java/com/linghu/controller/PlatformController.java index 5b6a75e..6cc20bd 100644 --- a/src/main/java/com/linghu/controller/PlatformController.java +++ b/src/main/java/com/linghu/controller/PlatformController.java @@ -9,6 +9,7 @@ import com.linghu.model.entity.Reference; import com.linghu.model.entity.Type; import com.linghu.model.excel.PlatformExcel; +import com.linghu.model.page.CustomPage; import com.linghu.service.PlatformService; import com.linghu.service.TypeService; @@ -103,15 +104,22 @@ } @GetMapping("/list") - @ApiOperation("查询平台列表") - public ResponseResult<Page<Platform>> list( - @RequestParam(required = false,defaultValue = "1") Integer page, - @RequestParam(required = false,defaultValue = "10") Integer pageSize) { - + @ApiOperation("查询平台列表,不传页数和大小就查全部") + public ResponseResult<CustomPage<Platform>> list( + @RequestParam(required = false) Integer page, + @RequestParam(required = false) Integer pageSize) { + if (page != null && pageSize != null) { Page<Platform> pageInfo = new Page<>(page, pageSize); Page<Platform> result = platformService.page(pageInfo); - return ResponseResult.success(result); + return ResponseResult.success(new CustomPage<>(result)); + } else { + List<Platform> list = platformService.list(); + CustomPage<Platform> customPage = new CustomPage<>(new Page<>()); + customPage.setRecords(list); + customPage.setTotal(list.size()); + return ResponseResult.success(customPage); + } } @GetMapping("/download") diff --git a/src/main/java/com/linghu/controller/QuestionController.java b/src/main/java/com/linghu/controller/QuestionController.java index 6c15d93..52aa5fc 100644 --- a/src/main/java/com/linghu/controller/QuestionController.java +++ b/src/main/java/com/linghu/controller/QuestionController.java @@ -1,18 +1,28 @@ package com.linghu.controller; +import com.alibaba.excel.EasyExcel; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.linghu.listener.QuestionExcelListener; import com.linghu.model.common.ResponseResult; import com.linghu.model.dto.KeywordDto; import com.linghu.model.entity.Question; import com.linghu.model.excel.KeywordExcel; +import com.linghu.model.excel.QuestionExcel; import com.linghu.service.QuestionService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -48,43 +58,57 @@ return ResponseResult.error("添加提问词失败"); } - @DeleteMapping("/{questionId}") - @ApiOperation(value = "删除提问词") - public ResponseResult<Void> delete(@PathVariable Integer questionId) { - - boolean success = questionService.removeById(questionId); - if (success) { - return ResponseResult.success(); - } - return ResponseResult.error("删除提问词失败"); - } - - // @PutMapping - // @Transactional - // public ResponseResult<Void> update(@RequestBody List<Question> questions) { - // boolean success = questionService.updateBatchById(questions); - // // 不存在的问题id就新增 - // List<Question> newQuestions = questions.stream() - // .filter(q -> q.getQuestion_id() == null) - // .collect(Collectors.toList()); - // if (!newQuestions.isEmpty()) { - // questionService.saveBatch(newQuestions); - // } - // if (success) { - // return ResponseResult.success(); - // } - // return ResponseResult.error("更新提问词失败"); - // } +// @DeleteMapping("/{questionId}") +// @ApiOperation(value = "删除提问词") +// public ResponseResult<Void> delete(@PathVariable Integer questionId) { +// +// boolean success = questionService.removeById(questionId); +// if (success) { +// return ResponseResult.success(); +// } +// return ResponseResult.error("删除提问词失败"); +// } @PutMapping @ApiOperation(value = "修改提问词") - public ResponseResult<Void> update(@RequestBody Question questions) { - boolean success = questionService.updateById(questions); - if (success) { - return ResponseResult.success(); + @Transactional + public ResponseResult<List<Question>> update(@RequestBody KeywordDto keywordDto) { + if (keywordDto.getStatus() != "customPage"){ + return ResponseResult.error("该关键词已提交或者已采集完成不允许修改提问词!"); + } + LambdaQueryWrapper<Question> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(Question::getKeyword_id, keywordDto.getKeyword_id()); + questionService.remove(queryWrapper); + + List<Question> questionList = Arrays.stream(keywordDto.getQuestions().split("\\n")) + .filter(q -> !q.trim().isEmpty()) + .map(q -> { + Question question = new Question(); + question.setKeyword_id(keywordDto.getKeyword_id()); + question.setQuestion(q.trim()); + question.setStatus("pending"); + + return question; + }).collect(Collectors.toList()); + + boolean success = questionService.saveBatch(questionList); + + + if(success) { + return ResponseResult.success(questionList); } return ResponseResult.error("更新提问词失败"); } + +// @PutMapping +// @ApiOperation(value = "修改提问词") +// public ResponseResult<Void> update(@RequestBody Question questions) { +// boolean success = questionService.updateById(questions); +// if (success) { +// return ResponseResult.success(); +// } +// return ResponseResult.error("更新提问词失败"); +// } // @DeleteMapping("/batch") // @Transactional @@ -112,4 +136,40 @@ return ResponseResult.success(list); } + + // 下载模板 + @PostMapping("/downloadTemplate") + @ApiOperation("下载模板") + public ResponseEntity<byte[]> downloadTemplate() throws IOException { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + EasyExcel.write(out, QuestionExcel.class).sheet("提问词模板").doWrite(new ArrayList<>()); + + return ResponseEntity.ok() + .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=question_template.xlsx") + .contentType(MediaType.APPLICATION_OCTET_STREAM) + .body(out.toByteArray()); + } + + // 导入文件 + @PostMapping("/import") + @ApiOperation("导入提问词词数据") + public ResponseResult<String> importPlatforms(@RequestParam("file") MultipartFile file) { + try { + if (file.isEmpty()) { + return ResponseResult.error("上传文件不能为空"); + } + // 创建数据监听器 + QuestionExcelListener listener = new QuestionExcelListener(); + EasyExcel.read(file.getInputStream(), QuestionExcel.class, listener) + .sheet() + .doRead(); + // 获取并合并关键词 + String mergedKeywords = String.join("\n", listener.getMergedKeywords()); + return ResponseResult.success(mergedKeywords); + } catch (IOException e) { + return ResponseResult.error("文件读取失败:" + e.getMessage()); + } catch (Exception e) { + return ResponseResult.error("导入失败:" + e.getMessage()); + } + } } \ No newline at end of file diff --git a/src/main/java/com/linghu/listener/QuestionExcelListener.java b/src/main/java/com/linghu/listener/QuestionExcelListener.java new file mode 100644 index 0000000..dd4ad03 --- /dev/null +++ b/src/main/java/com/linghu/listener/QuestionExcelListener.java @@ -0,0 +1,28 @@ +package com.linghu.listener; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.read.listener.ReadListener; +import com.linghu.model.excel.QuestionExcel; + +public class QuestionExcelListener implements ReadListener<QuestionExcel> { + private final List<String> questionList = new ArrayList<>(); + + @Override + public void invoke(QuestionExcel data, AnalysisContext context) { + if (data.getQuestion() != null && !data.getQuestion().trim().isEmpty()) { + questionList.add(data.getQuestion().trim()); + } + } + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + // 数据读取完成后的处理 + } + + public String getMergedKeywords() { + return String.join("\n", questionList); + } +} diff --git a/src/main/java/com/linghu/model/excel/QuestionExcel.java b/src/main/java/com/linghu/model/excel/QuestionExcel.java new file mode 100644 index 0000000..b07b791 --- /dev/null +++ b/src/main/java/com/linghu/model/excel/QuestionExcel.java @@ -0,0 +1,10 @@ +package com.linghu.model.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +@Data +public class QuestionExcel { + @ExcelProperty("提问词名称") + private String question; +} diff --git a/src/main/java/com/linghu/service/OrderService.java b/src/main/java/com/linghu/service/OrderService.java index 9d84419..88fa8ce 100644 --- a/src/main/java/com/linghu/service/OrderService.java +++ b/src/main/java/com/linghu/service/OrderService.java @@ -27,4 +27,9 @@ boolean saveOrderWithKeywords(OrderDto orderDto, String order_id); List<KeywordDto> getKeywordListByOrderId(String order_id); + + /** + * 获取客户列表 + */ + Page<String> getClientList(String clientName,Integer pageNum, Integer pageSize); } diff --git a/src/main/java/com/linghu/service/impl/OrderServiceImpl.java b/src/main/java/com/linghu/service/impl/OrderServiceImpl.java index f138d7f..c3b8602 100644 --- a/src/main/java/com/linghu/service/impl/OrderServiceImpl.java +++ b/src/main/java/com/linghu/service/impl/OrderServiceImpl.java @@ -1,5 +1,8 @@ package com.linghu.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.linghu.model.dto.KeywordDto; @@ -14,6 +17,7 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; import com.linghu.service.QuestionService; import org.springframework.beans.BeanUtils; @@ -35,6 +39,8 @@ private KeywordService keywordService; @Autowired private QuestionService questionService; + @Autowired + private OrderMapper orderMapper; @Override @Transactional(rollbackFor = Exception.class) @@ -116,4 +122,42 @@ } return keywordDtos; } + + @Override + public Page<String> getClientList(String clientName, Integer pageNum, Integer pageSize) { + Page<Orders> page = new Page<>(pageNum, pageSize); + + // 构建查询条件(根据客户名称模糊搜索) + LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.select(Orders::getClient_name) // 只查询客户名称字段 + .eq(Orders::getDel_flag, 0) // 只查询未删除的订单 + .groupBy(Orders::getClient_name); // 按客户名称分组去重 + + if (clientName != null && !clientName.isEmpty()) { + queryWrapper.like(Orders::getClient_name, clientName); + } + + // 执行分页查询 + IPage<Orders> orderPage = orderMapper.selectPage(page, queryWrapper); + + // 转换为客户选项列表(统计每个客户的订单数量) + List<String> clientOptions = orderPage.getRecords().stream() + .map(order -> { + + + return order.getClient_name(); + }) + .collect(Collectors.toList()); + + // 构建结果分页对象 + Page<String> resultPage = new Page<>(); + resultPage.setCurrent(orderPage.getCurrent()); + resultPage.setSize(orderPage.getSize()); + resultPage.setTotal(orderPage.getTotal()); + resultPage.setRecords(clientOptions); + + return resultPage; + + + } } -- Gitblit v1.7.1