src/main/java/com/linghu/config/MybatisPlusConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/AuthController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/CollectController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/OrderController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/PlatformController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/controller/QuestionController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/listener/QuestionExcelListener.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/model/excel/QuestionExcel.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/service/OrderService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/linghu/service/impl/OrderServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/linghu/config/MybatisPlusConfig.java
File was deleted 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); // } } 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)); 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); } 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") 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()); } } } src/main/java/com/linghu/listener/QuestionExcelListener.java
New file @@ -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); } } src/main/java/com/linghu/model/excel/QuestionExcel.java
New file @@ -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; } 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); } 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; } }