guyue
3 天以前 d097cca97b1ab6717b37bce5cd48cca1c5ab69a1
提问词excel,获取客户列表,
1个文件已删除
2个文件已添加
7个文件已修改
390 ■■■■ 已修改文件
src/main/java/com/linghu/config/MybatisPlusConfig.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/AuthController.java 68 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/CollectController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/OrderController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/PlatformController.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/controller/QuestionController.java 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/listener/QuestionExcelListener.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/model/excel/QuestionExcel.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/service/OrderService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/linghu/service/impl/OrderServiceImpl.java 44 ●●●●● 补丁 | 查看 | 原始文档 | 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;
    }
}